pandas
| Тип | библиотека анализа данных |
|---|---|
| Автор | Уэс Маккинни |
| Создана | 2008 (AQR Capital), открыт код в 2009 |
| Языки | Python, Cython, C |
| Лицензия | BSD-3-Clause |
| Основные объекты | DataFrame (таблица), Series (столбец) |
| Основа | NumPy, Apache Arrow (опционально) |
| Альтернативы | Polars, DuckDB |
pandas — библиотека Python для работы с табличными данными. Её основной объект — DataFrame, таблица со строками и именованными столбцами разных типов, похожая на лист Excel или таблицу базы данных, но управляемая кодом. pandas читает данные из CSV, Excel, JSON, Parquet и SQL, позволяет фильтровать, группировать, объединять и переформатировать их и сохранять результат обратно.
pandas — стандартный инструмент аналитиков и специалистов по данным: на нём делается очистка данных, разведочный анализ в Jupyter и подготовка признаков для машинного обучения.
История
Уэс Маккинни начал писать pandas в 2008 году в инвестиционной компании AQR Capital, где ему не хватало удобных средств анализа финансовых данных в Python; в 2009 году код открыли. Название происходит от термина эконометрики panel data и от «Python data analysis». Маккинни написал о библиотеке книгу «Python for Data Analysis», третье издание которой доступно бесплатно онлайн.[3] pandas построена на массивах NumPy; с версии 2.0 (2023) столбцы можно хранить и в формате Apache Arrow, что ускоряет работу со строками и пропусками.[6]
Основы
import pandas as pd
df = pd.read_csv("orders.csv", parse_dates=["created_at"])
df.head() # первые строки
df.info() # столбцы, типы, пропуски
df.describe() # статистика по числовым столбцам
paid = df[df["status"] == "paid"] # фильтрация строк
big = df.query("total > 5000 and city == 'Москва'") # то же строкой запроса
df["total_with_vat"] = df["total"] * 1.2 # новый столбец
df.loc[df["total"] < 0, "total"] = 0 # изменение по условию
Series — один столбец с индексом, DataFrame — набор Series с общим индексом. Индексация df.loc[строки, столбцы] работает по меткам, df.iloc[...] — по позициям.[2]
Группировка и агрегация
summary = (
df.groupby("city")
.agg(orders=("id", "count"), revenue=("total", "sum"), avg_check=("total", "mean"))
.sort_values("revenue", ascending=False)
)
monthly = df.set_index("created_at").resample("MS")["total"].sum() # выручка по месяцам
pivot = df.pivot_table(index="city", columns="status", values="total", aggfunc="sum")
Схема «разделить — применить — объединить» (split-apply-combine) — основа анализа: данные делятся на группы, к каждой применяется функция, результаты собираются в таблицу. Это аналог GROUP BY в SQL.
Объединение таблиц
customers = pd.read_sql("SELECT id, name, segment FROM customers", engine)
merged = df.merge(customers, left_on="customer_id", right_on="id", how="left")
both = pd.concat([df_2025, df_2026], ignore_index=True)
merge — аналог JOIN в SQL (how="inner" | "left" | "right" | "outer"), concat склеивает таблицы по строкам или столбцам.
Пропуски и типы
Пропуски обозначаются NaN, None или pd.NA; их находят isna(), удаляют dropna() и заполняют fillna(). Правильные типы экономят память и ускоряют работу: category для столбцов с небольшим числом значений, даты вместо строк, типы с поддержкой пропусков (Int64, string) вместо object.
Производительность
- Векторизация вместо циклов.
df.applyи особенноiterrows()выполняют Python-код для каждой строки и медленны; операции над целыми столбцами и встроенные методы — в разы быстрее. - Форматы. Parquet читается быстрее CSV, хранит типы и сжимает данные.
- Copy-on-Write. Новая модель копирования делает поведение предсказуемым: изменение производной таблицы не меняет исходную, а предупреждение
SettingWithCopyWarningуходит в прошлое.[4] - Объём. pandas держит данные в памяти одной машины; для таблиц, которые в неё не помещаются, нужны другие инструменты.
Polars и другие альтернативы
| Инструмент | Особенности |
|---|---|
| pandas | самая большая экосистема, привычный API, огромное число примеров |
| Polars | написан на Rust, многопоточный, ленивые запросы с оптимизатором, обычно заметно быстрее[5] |
| DuckDB | встраиваемая аналитическая СУБД: SQL прямо по файлам Parquet и CSV и по таблицам pandas |
| PySpark, Dask | распределённая обработка на кластерах |
Многие задачи удобно решать комбинацией: DuckDB или Polars для тяжёлых преобразований, pandas — для финальной обработки и совместимости с библиотеками визуализации и машинного обучения. Обмен данными между ними почти без копирования обеспечивает формат Apache Arrow.
Советы
- Начинайте анализ с
df.info()иdf.describe(), проверяйте типы и пропуски сразу после загрузки. - Пишите преобразования цепочками методов — их легче читать и отлаживать.
- Фиксируйте версии pandas в проекте: поведение некоторых операций меняется между мажорными версиями.
Краткое введение — руководство «10 minutes to pandas», полная справка — документация pandas.[2][1]