Перейти к основному содержимому

Pandas — типовые операции при анализе данных

Аналитику Разработчику

Назначение

Сводка типовых вызовов pandas, которые закрывают большинство задач при исследовании таблицы в ноутбуке или скрипте: от read_csv() до экспорта отчёта. Команды сгруппированы по смыслу, как в учебных шпаргалках по DataFrame.

Для очистки (пропуски, дубликаты, типы) — подробный порядок шагов в 427. Для merge, pivot и календарных срезов — 331. Те же операции в Polars, SQL и PySpark426.

Соглашения

dfDataFrame, col — имя столбца. Примеры рассчитаны на import pandas as pd. После загрузки полезно сразу выполнить df.head(), df.info() и df.describe().

Загрузка данных

ФорматКомандаЗаметка
CSVdf = pd.read_csv("file.csv")Кодировка: encoding="utf-8"; типы: dtype={"id": str}
Exceldf = pd.read_excel("file.xlsx", sheet_name="Sheet1")Нужен пакет openpyxl для .xlsx
SQLdf = pd.read_sql(query, connection)Через драйвер или SQLAlchemy
JSONdf = pd.read_json("file.json")Для вложенных структур иногда нужен json_normalize
Parquetdf = pd.read_parquet("file.parquet")Столбцовый формат, быстрый повторный чтение

read_csv() — самый частый вход: разделитель, кавычки и пустые ячейки как NaN подбираются автоматически; при сомнениях смотрите df.info().


Выбор и фильтрация

ЗадачаКомандаКомментарий
Один столбецdf["col"]Возвращает Series
По меткамdf.loc[row_label, "col"]Строка и столбец по имени; срез df.loc["a":"c"] включает правую границу
По позицииdf.iloc[0:5, 0:2]Первые 5 строк, первые 2 столбца; правая граница исключается
Условие в строкеdf.query("col > 5")Удобно для нескольких полей; имена с пробелами — в обратных кавычках
Значение из спискаdf[df["col"].isin(["A", "B"])]Аналог IN в SQL

При комбинации условий в [] используйте &, |, ~ и скобки: df[(df["a"] > 0) & (df["b"] == "x")]. Подробнее про loc / iloc331.


Преобразование таблицы

ЗадачаКомандаКомментарий
Группировка и агрегатыdf.groupby("col").agg({"col2": ["mean", "sum"]})Именованные агрегаты: .agg(total=("amount", "sum"))
Соединение таблицdf.merge(df2, on="key", how="left")how: inner, left, right, outer
Сводная таблицаdf.pivot_table(values="val", index="idx", columns="cat", aggfunc="sum")Как свод в Excel
Сортировкаdf.sort_values(["col1", "col2"])ascending=[True, False] для разных направлений
Широкий → длинныйdf.melt(id_vars=["id"], value_vars=["A", "B"])Перед построением графиков по категориям
Функция по столбцуdf["col"].apply(lambda x: x * 2)По строкам медленнее: axis=1; предпочитайте векторизацию

groupby() в паре с agg() — основной способ собрать статистику по регионам, месяцам или статусам в несколько строк кода.


Статистика и описательный анализ

ЗадачаКомандаКомментарий
Сводка по числамdf.describe()count, mean, std, квантили; категории — include="object"
Агрегаты по столбцуdf["col"].agg(["mean", "median", "std"])Список функций в одном вызове
Частотыdf["col"].value_counts(normalize=True)normalize=True — доли от общего числа
Корреляцияdf.corr(method="pearson")Матрица между числовыми столбцами
Ковариацияdf.cov()Линейная связь в парах признаков
Квантилиdf["col"].quantile([0.25, 0.5, 0.75])Медиана — 0.5

После describe() имеет смысл проверить выбросы и распределения на графике (df.plot, Seaborn) — см. обзор pandas и визуализации.


Очистка

ЗадачаКомандаКомментарий
Удалить пропускиdf.dropna(subset=["col"], how="any")how="all" — строка полностью пустая
Заполнить вперёдdf["col"].ffill()Для всей таблицы: df.ffill()
Дубликатыdf.drop_duplicates(subset=["col"])keep="first" / "last"
Замена значенийdf["col"].replace({"old": "new"})Несколько пар в одном словаре
Категориальный типdf["col"].astype("category")Экономия памяти на повторяющихся строках
Интерполяцияdf["col"].interpolate(method="linear")Для рядов с упорядоченным индексом; по времени — method="time"

Расширенные таблицы и мини-пайплайн очистки — 427.


Временные ряды

Индекс должен быть типа DatetimeIndex (часто после df["date"] = pd.to_datetime(df["date"]) и df = df.set_index("date")).

ЗадачаКомандаКомментарий
Агрегация по периодуdf["val"].resample("M").mean()"M" — месяц; "D" — день; "W" — неделя
Скользящее среднееdf["val"].rolling(window=7).mean()Сглаживание шума
Сдвиг по времениdf["val"].shift(periods=1)Лаг на одну строку
Календарный диапазонpd.date_range("2024", periods=12, freq="M")Генерация меток без исходной таблицы
Регулярная сеткаseries.asfreq("D", method="ffill")Заполнение пропущенных дат в ряду
Формат даты в строкуdf["date"].dt.strftime("%Y-%m-%d")После pd.to_datetime

Примеры resample, rolling и срезов по периоду — 331.


Строковые столбцы

Доступ через .str (векторизованные операции, без цикла по строкам).

ЗадачаКомандаКомментарий
Подстрока / шаблонdf["col"].str.contains("pattern")RegEx, regex=True
Извлечь группуdf["col"].str.extract(r"(\d+)")Первая группа в скобках
Разделитьdf["col"].str.split("_").str[0]Часть до первого _
Регистрdf["col"].str.lower()Также upper, title
Пробелы по краямdf["col"].str.strip()lstrip, rstrip
Нормализация пробеловdf["col"].str.replace(r"\s+", " ", regex=True)Несколько пробелов → один

Имена столбцов с пробелами часто приводят к единому виду: df.columns = df.columns.str.strip().str.lower().


Дополнительные приёмы

ЗадачаКомандаКомментарий
Цепочка с функциейdf.pipe(func)func принимает DataFrame и возвращает DataFrame
Выражение над столбцамиpd.eval("df1 + df2")Ускорение на больших таблицах при совместимых типах
Памятьdf.memory_usage(deep=True)Оценка перед загрузкой ещё одного файла
Только числаdf.select_dtypes(include=["number"])Исключить строки и категории перед corr
Топ-Ndf.nlargest(5, "col")nsmallest для минимумов
Списки в ячейкахdf.explode("col")Одна строка на каждый элемент списка

Экспорт результатов

ФорматКомандаЗаметка
CSVdf.to_csv("output.csv", index=False)index=False — без служебного индекса
Exceldf.to_excel("output.xlsx", sheet_name="Sheet1")Индекс: параметр index
Parquetdf.to_parquet("output.parquet")Удобно для промежуточных витрин
JSONdf.to_json("output.json", orient="records")orient="records" — список объектов по строкам

Практические советы

  • После фильтрации сохраняйте явную копию: subset = df[df["col"] > 0].copy() — так реже появляется SettingWithCopyWarning.
  • Цепочка методов читается сверху вниз: df.dropna().assign(ratio=lambda x: x["a"] / x["b"]).groupby("region").mean().
  • Повторяющиеся строки (страна, статус, SKU) храните как category — меньше RAM и быстрее groupby.
  • inplace=True меняет объект на месте; в скриптах и ноутбуках чаще пишут df = df.dropna(), чтобы проще откатывать шаг.

См. также

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").