Menu
CoddyTech

Шпаргалка по pandas

Последнее обновление

Создание DataFrame

Небольшие DataFrame, собранные вручную: для примеров, тестов и справочных таблиц.

ЗадачаКод
Импорт pandas и NumPyimport pandas as pd import numpy as np
Из словаря столбцовdf = pd.DataFrame({"name": ["Ada", "Ben"], "age": [36, 28]})
Из списка строкpd.DataFrame([{"name": "Ada", "age": 36}, {"name": "Ben", "age": 28}])
Из массива NumPypd.DataFrame(np.arange(6).reshape(3, 2), columns=["x", "y"])
Series с меткамиs = pd.Series([3, 5, 2], index=["a", "b", "c"])
Диапазон датpd.date_range("2026-01-01", periods=7, freq="D")

Чтение и запись файлов

Один вызов загружает файл в DataFrame, другой записывает его обратно.

ЗадачаКод
Прочитать CSVdf = pd.read_csv("sales.csv")
Только нужные столбцы, даты как датыpd.read_csv("sales.csv", usecols=["date", "city", "sales"], parse_dates=["date"])
Столбец в качестве индексаpd.read_csv("sales.csv", index_col="id")
Табуляция или другой разделительpd.read_csv("sales.tsv", sep="\t")
Дополнительные метки пропусковpd.read_csv("sales.csv", na_values=["n/a", "-"])
Прочитать только первые строкиpd.read_csv("sales.csv", nrows=1000)
Прочитать лист Excel (нужен openpyxl)pd.read_excel("report.xlsx", sheet_name="2026")
Прочитать записи JSONpd.read_json("records.json")
Прочитать из SQL-базыpd.read_sql("SELECT * FROM orders", conn)
Записать CSV без индексаdf.to_csv("clean.csv", index=False)
Записать в Excel или Parquetdf.to_excel("clean.xlsx", index=False), df.to_parquet("clean.parquet")

Первый взгляд на данные

С этих вызовов стоит начинать знакомство с любым новым датасетом.

ЗадачаКод
Первые и последние строкиdf.head(), df.tail(3)
Число строк и столбцовdf.shape # (6, 7)
Типы столбцов и число непустых значенийdf.info()
Статистика по числовым столбцамdf.describe()
Сводка по всем столбцамdf.describe(include="all")
Имена и типы столбцовdf.columns, df.dtypes
Частота каждого значенияdf["city"].value_counts()
Доля каждого значенияdf["city"].value_counts(normalize=True)
Уникальные значения и их числоdf["city"].unique(), df["city"].nunique()
Пропуски по столбцамdf.isna().sum()
Случайная выборка строкdf.sample(3, random_state=0)
Корреляция числовых столбцовdf.corr(numeric_only=True)

Выбор столбцов и строк

loc выбирает по меткам и включает конец среза. iloc выбирает по позициям и конец не включает.

ЗадачаКод
Один столбец как Seriesdf["age"]
Несколько столбцов как DataFramedf[["name", "age"]]
Строки и столбцы по меткамdf.loc[0:2, ["name", "age"]]
Строки и столбцы по позициямdf.iloc[0:2, 0:3]
Одно значениеdf.at[0, "age"], df.iat[0, 3]
Последняя строкаdf.iloc[-1]
Столбцы одного типаdf.select_dtypes(include="number")
Текстовые столбцы (pandas 3)df.select_dtypes(include="str")
Столбцы по шаблону имениdf.filter(like="sal"), df.filter(regex="^(age|salary)$")
Поиск строк по столбцуdf.set_index("name").loc["Ada", "salary"]
Вернуть индекс 0, 1, 2df.reset_index(drop=True)
Удалить столбцы или строкиdf.drop(columns=["email"]), df.drop(index=[0, 1])

Фильтрация строк

Бери каждое условие в скобки и объединяй их через & (и), | (или) и ~ (не).

ЗадачаКод
Строки по условиюdf[df["age"] > 30]
Оба условияdf[(df["age"] > 30) & (df["city"] == "Oslo")]
Любое из условийdf[(df["city"] == "Oslo") | (df["salary"] > 6000)]
Значение из спискаdf[df["city"].isin(["Oslo", "Rome"])]
Значение не из спискаdf[~df["city"].isin(["Oslo", "Rome"])]
Между двумя значениями, включая границыdf[df["age"].between(30, 40)]
Фильтр строкой запросаdf.query("age > 30 and city == 'Oslo'")
Переменная в запросеmin_age = 30 df.query("age > @min_age")
Текст содержитdf[df["name"].str.contains("e", case=False)]
Пропущенные или заполненные значенияdf[df["age"].isna()], df[df["age"].notna()]
Отфильтровать строки и выбрать столбцыdf.loc[df["age"] > 30, ["name", "salary"]]
Первые или последние n строкdf.nlargest(3, "salary"), df.nsmallest(2, "age")
Строки с повторяющимся значениемdf[df.duplicated(subset=["city"], keep=False)]

Сортировка и ранжирование

ЗадачаКод
Сортировка по столбцуdf.sort_values("salary")
По убываниюdf.sort_values("salary", ascending=False)
Сортировка по нескольким столбцамdf.sort_values(["city", "salary"], ascending=[True, False])
Пропуски в началеdf.sort_values("age", na_position="first")
Сортировка по индексуdf.sort_index()
Ранги, 1 у наибольшегоdf["salary"].rank(ascending=False)

Добавление и изменение столбцов

Операции над целым столбцом работают быстро. Берись за apply, только если нет подходящего встроенного метода.

ЗадачаКод
Новый столбец из другихdf["bonus"] = df["salary"] * 0.1
Добавить столбец в цепочкеdf.assign(bonus=lambda d: d["salary"] * 0.1)
Значение по условиюdf["level"] = np.where(df["age"] >= 40, "senior", "junior")
Значение по нескольким условиямdf["band"] = np.select([df["age"] < 30, df["age"] < 45], ["young", "mid"], default="senior")
Изменить значения там, где выполнено условиеdf.loc[df["city"] == "Lima", "salary"] = 4000
Замена значений по словарюdf["country"] = df["city"].map({"Oslo": "NO", "Rome": "IT", "Lima": "PE"})
Применить функцию к столбцуdf["salary"].apply(lambda x: round(x, -3))
Применить функцию к каждой ячейкеdf[["age", "salary"]].map(lambda x: x / 1000)
Переименовать столбцыdf.rename(columns={"salary": "pay"})
Изменить тип столбцаdf["salary"].astype("float64")
Текст в числа, ошибки в NaNpd.to_numeric(s, errors="coerce")
Числа в интервалы с меткамиpd.cut(df["age"], bins=[0, 30, 45, 120], labels=["young", "mid", "senior"])
Числа в группы равного размераpd.qcut(df["salary"], q=4, labels=False)
Цикл по строкам (медленно, крайний случай)for row in df.itertuples(): print(row.name, row.salary)

Пропуски и очистка данных

Пропущенные числа выглядят как NaN, пропущенные даты как NaT. Каждый из этих вызовов возвращает новый объект, так что присваивай результат.

ЗадачаКод
Доля пропусков по столбцамdf.isna().mean()
Удалить строки с любым пропускомdf.dropna()
Удалить строки без ключевого столбцаdf.dropna(subset=["age"])
Заполнить значением для каждого столбцаdf.fillna({"age": df["age"].median()})
Заполнить из предыдущей или следующей строкиdf["age"].ffill(), df["age"].bfill()
Заполнить пропуски интерполяциейdf["age"].interpolate()
Превратить метки в пропускиdf.replace(["n/a", "-", ""], np.nan)
Удалить дубликаты строкdf.drop_duplicates()
Оставить последнюю строку по ключуdf.drop_duplicates(subset=["city"], keep="last")
Привести в порядок имена столбцовdf.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")
Ограничить выбросыdf["salary"].clip(lower=4000, upper=6000)
Тип category для повторяющегося текстаdf["city"] = df["city"].astype("category")

Текстовые столбцы (.str)

В pandas 3 текстовые столбцы по умолчанию получают dtype str. Методы .str работают сразу со всем столбцом, а пропуски так и остаются пропусками.

ЗадачаКод
Верхний, нижний регистр, с заглавнойdf["name"].str.upper(), df["name"].str.lower(), df["name"].str.title()
Убрать пробелы по краямdf["name"].str.strip()
Заменить текстdf["email"].str.replace("mail.com", "example.com")
Замена по регулярному выражениюdf["email"].str.replace(r"@.*", "", regex=True)
Содержит, начинается сdf["name"].str.contains("a"), df["name"].str.startswith("E")
Длина каждого значенияdf["name"].str.len()
Первые символыdf["name"].str[:2]
Разбить на столбцыdf["email"].str.split("@", expand=True)
Извлечь группу регулярного выраженияdf["email"].str.extract(r"@(\w+)")
Склеить текстовые столбцыdf["name"] + " (" + df["city"] + ")"
Дополнить числа нулямиdf["salary"].astype("str").str.zfill(6)
Новый текстовый dtypedf["name"].dtype # str

Даты и время

Аксессор .dt работает со столбцами datetime. Отсортированный индекс дат (ts ниже) позволяет делать срезы по строкам с датами и ресемплинг.

ЗадачаКод
Преобразовать столбец в datetimedf["date"] = pd.to_datetime(df["date"])
Разбор по точному форматуpd.to_datetime(["03/01/2026", "15/01/2026"], format="%d/%m/%Y")
Год, месяц, название дня неделиdf["date"].dt.year, df["date"].dt.month, df["date"].dt.day_name()
Сгруппировать даты по месяцамdf["date"].dt.to_period("M")
Дней между двумя датами(pd.Timestamp("2026-12-31") - df["date"]).dt.days
Прибавить дни или месяцыdf["date"] + pd.Timedelta(days=30), df["date"] + pd.DateOffset(months=1)
Строки в диапазоне датdf[df["date"].between("2021-01-01", "2022-12-31")]
Индекс дат, срез по строкеts = df.set_index("date").sort_index() ts.loc["2021":"2022"]
Сумма по месяцамts["salary"].resample("ME").sum()
Среднее по неделям; "QE" по кварталам, "YE" по годамts["salary"].resample("W").mean()
Скользящее среднееts["salary"].rolling(3).mean()
Изменение относительно предыдущей строкиts["salary"].diff(), ts["salary"].pct_change()
Сдвинуть значения на строку внизts["salary"].shift(1)
Нарастающий итогts["salary"].cumsum()
Задать и сменить часовой поясts.index.tz_localize("UTC").tz_convert("Europe/Oslo")

Группировка и агрегация

groupby разбивает строки по ключу, применяет функцию к каждой группе и собирает результаты вместе.

ЗадачаКод
Среднее по группамdf.groupby("city")["salary"].mean()
Несколько статистик сразуdf.groupby("city")["salary"].agg(["mean", "max", "count"])
Свои имена итоговых столбцовdf.groupby("city").agg(avg_pay=("salary", "mean"), people=("name", "count"))
Группировка по двум столбцамdf.groupby(["city", "team"])["salary"].sum()
Оставить ключи столбцамиdf.groupby("city", as_index=False)["salary"].mean()
Число строк в группеdf.groupby("city").size()
Результат группы в каждой строкеdf["city_avg"] = df.groupby("city")["salary"].transform("mean")
Оставить только часть группdf.groupby("city").filter(lambda g: len(g) >= 2)
Строка с максимумом в группеdf.loc[df.groupby("city")["salary"].idxmax()]
Первые n строк в группеdf.sort_values("salary", ascending=False).groupby("city").head(2)
Пронумеровать строки в группеdf.groupby("city").cumcount()
Цикл по группамfor city, group in df.groupby("city"): print(city, len(group))
Фильтр, группировка и сортировка одной цепочкой(df.query("age > 30") .groupby("city", as_index=False) .agg(avg_pay=("salary", "mean")) .sort_values("avg_pay", ascending=False))

Сводные таблицы и изменение формы

В длинном формате одна строка на одно наблюдение. В широком одна переменная разложена по столбцам.

ЗадачаКод
Сводная таблицаdf.pivot_table(index="city", columns="team", values="salary", aggfunc="mean", fill_value=0)
Сводная таблица с итогамиdf.pivot_table(index="city", values="salary", aggfunc="sum", margins=True)
Подсчёт сочетанийpd.crosstab(df["city"], df["team"])
Доли по строкамpd.crosstab(df["city"], df["team"], normalize="index")
Из широкого формата в длинныйlong = df.melt(id_vars="name", value_vars=["age", "salary"], var_name="field", value_name="value")
Из длинного формата в широкийlong.pivot(index="name", columns="field", values="value")
Внутренний уровень индекса в столбцыdf.groupby(["city", "team"])["salary"].sum().unstack(fill_value=0)
Строка на каждый элемент спискаpd.DataFrame({"id": [1, 2], "tags": [["a", "b"], ["c"]]}).explode("tags")
One-hot кодирование столбцаpd.get_dummies(df["team"], prefix="team")
Поменять строки и столбцы местамиdf.T

Объединение DataFrame

concat складывает таблицы вместе, а merge соединяет их по ключевым столбцам, как JOIN в SQL.

ЗадачаКод
Склеить строкиpd.concat([df_2025, df_2026], ignore_index=True)
Поставить рядомpd.concat([left, right], axis=1)
Соединить по ключевому столбцуorders.merge(customers, on="customer_id", how="left")
Типы соединенийhow="inner", "left", "right", "outer"
Ключи с разными именамиorders.merge(users, left_on="customer_id", right_on="id")
Проверить соединение и пометить источник строкorders.merge(customers, on="customer_id", how="left", validate="many_to_one", indicator=True)
Соединить по индексуleft.join(right, how="inner")
Строки без пары в другой таблицеorders[~orders["customer_id"].isin(customers["customer_id"])]

Графики в pandas

pandas рисует через Matplotlib. Каждый вызов графика возвращает Matplotlib ax, так что оформление можно продолжить.

ЗадачаКод
Линейный график Seriests["salary"].plot()
Линейный график по двум столбцамdf.plot(x="date", y="salary")
Столбчатая диаграмма по сводкеdf.groupby("city")["salary"].mean().plot.bar()
Отсортированные горизонтальные столбцыdf["city"].value_counts().sort_values().plot.barh()
Гистограммаdf["salary"].plot.hist(bins=20)
Диаграмма рассеянияdf.plot.scatter(x="age", y="salary")
Ящик с усами по группамdf.boxplot(column="salary", by="city")
Заголовок и подпись осиax = df.plot(x="date", y="salary", title="Salary") ax.set_ylabel("EUR")
Показать или сохранить графикplt.show(), ax.figure.savefig("salary.png", dpi=150)

pandas 3: старые формы и что писать теперь

Код из старых туториалов в pandas 3 часто падает или выдаёт предупреждения. Пиши вместо него то, что указано в столбце pandas 3.

Задачаpandas 3Старая форма
Функция для каждой ячейкиdf.map(f)df.applymap(f)
Заполнить из предыдущей строкиdf.ffill()df.fillna(method="ffill")
Добавить строкиpd.concat([df, new_rows])df.append(new_rows)
Ресемплинг на конец месяцаts["salary"].resample("ME").sum()resample("M")
Даты с шагом в часpd.date_range("2026-01-01", periods=24, freq="h")freq="H"
Задать одно значениеdf.loc[0, "age"] = 37df["age"][0] = 37
Изменить отфильтрованную частьhigh = df[df["salary"] > 5000] high["salary"] = 0high = df[df["salary"] > 5000].copy()
Это текстовый столбец?df["name"].dtype == "str"df["name"].dtype == object

Код pandas, который аналитик данных пишет каждый день, разбитый по задачам: создать и загрузить данные, изучить их, выбрать и отфильтровать строки, добавить столбцы, разобраться с пропусками, поработать с текстом и датами, сгруппировать и агрегировать, изменить форму таблицы, объединить таблицы и построить график. В каждой строке короткий фрагмент кода, который можно сразу вставить, и одна строчка о том, что он делает.

Всё здесь написано для pandas 3, той версии, что работает на Coddy: текстовые столбцы получают новый dtype str, Copy-on-Write включён всегда, а удалённые API вроде applymap и fillna(method=...) остались только в таблице старых форм. В примерах используется DataFrame df со столбцами name, city, team, age, salary, date и email. Только начинаешь с Python? Загляни в шпаргалку по Python и песочницу Python, а рядом с этой шпаргалкой держи шпаргалки по NumPy, Matplotlib и scikit-learn.

Частые вопросы о шпаргалке по pandas

Эта шпаргалка по pandas бесплатная?
Да. Эта шпаргалка по pandas полностью бесплатна, регистрация не нужна. Добавь её в закладки или сохрани в PDF через печать в браузере и возвращайся, когда нужно вспомнить точный вызов для groupby, merge или сводной таблицы.
Какую версию pandas охватывает шпаргалка?
pandas 3. Текстовые столбцы используют новый dtype str, Copy-on-Write включён всегда, а вызовы, удалённые в pandas 3 (applymap, fillna(method=...), append, псевдонимы частоты M и H), есть только в последней таблице, рядом с тем, что писать вместо них. Почти все примеры работают и в pandas 2.2, кроме строк, которые опираются на dtype str или на Copy-on-Write.
Чем loc отличается от iloc?
loc выбирает по меткам, то есть по значениям индекса и именам столбцов, и срез вроде df.loc[0:2] включает свой конец. iloc выбирает по целочисленной позиции, как список в Python, поэтому df.iloc[0:2] возвращает первые две строки и конец не включает. С помощью loc с условием можно за один шаг отфильтровать строки и выбрать столбцы: df.loc[df["age"] > 30, ["name"]].
Как отфильтровать DataFrame по нескольким условиям?
Возьми каждое условие в скобки и соедини их через & для «и», | для «или» и ~ для «не»: df[(df["age"] > 30) & (df["city"] == "Oslo")]. Питоновские and и or с целыми столбцами не работают. Длинные фильтры удобнее читать в виде df.query("age > 30 and city == 'Oslo'").
Чем отличаются merge, join и concat?
merge объединяет два DataFrame по ключевым столбцам, как JOIN в SQL, с параметром how="inner", "left", "right" или "outer". join это сокращение для объединения по индексу. concat вообще не сопоставляет ключи: он ставит таблицы одну под другой или, с axis=1, рядом друг с другом.
Почему присваивание не меняет DataFrame?
Начиная с pandas 3, из-за Copy-on-Write любой отбор ведёт себя как копия. Цепочное присваивание вроде df["age"][0] = 37 меняет временный объект, а df остаётся прежним. Пиши это одним вызовом loc: df.loc[0, "age"] = 37. Методы вроде dropna и fillna тоже возвращают новый объект, так что присваивай результат.
Можно ли запускать код pandas онлайн?
Да. Бесплатная песочница Matplotlib запускает Python с pandas, NumPy, Matplotlib и scikit-learn прямо в браузере, так что любой фрагмент из этой шпаргалки можно вставить и запустить без установки. Курс Coddy по машинному обучению учит pandas шаг за шагом, от первого DataFrame до данных, на которых обучается модель.
Иллюстрация языков программирования Coddy

Изучайте Pandas с Coddy

НАЧАТЬ