Pandas за один вечер: базовые операции для питониста
Вы знаете Python, но ещё не работали с pandas. За час разберём загрузку данных, фильтрацию, группировку и сохранение результата — без лишней теории, только то, что нужно в реальной работе.

Если вы пишете на Python и вам прислали CSV на пару сотен тысяч строк с задачей «посчитай выручку по регионам», встроенного модуля csv и цикла хватит, но кода будет много и он будет медленным. Pandas решает ту же задачу в три-четыре строки. За этот час вы научитесь загружать данные, фильтровать строки, считать агрегаты по группам и выгружать результат обратно. Всё на pandas 2.x и Python 3.10+.
Что нужно до начала
Проверьте, что установлен свежий pandas. В версии 2.0 сменился движок типов и часть поведения, поэтому примеры ниже рассчитаны именно на 2.x.
# в терминале, не в Python
python -m pip install "pandas>=2.0"
# проверка версии
python -c "import pandas as pd; print(pd.__version__)"Должно вывести что-то вроде 2.2.2. Если версия начинается с 1., обновитесь: часть примеров с numeric_only и типом string поведёт себя иначе.
Дальше по коду принято сокращение import pandas as pd — это не стиль, а фактический стандарт, документация pandas везде использует именно его.
Две структуры, которые надо различать
Pandas стоит на двух объектах. Series — это одномерный массив с индексом, по сути один столбец. DataFrame — таблица, набор Series с общим индексом строк. Почти всё, что вы делаете, — это операции над DataFrame, которые возвращают либо новый DataFrame, либо Series.
Главное отличие от списков и словарей: операции применяются сразу ко всему столбцу, без цикла. Если вы пишете for row in ... по строкам pandas — почти всегда есть способ короче и быстрее.Шаг 1. Загрузка данных
Чаще всего данные приходят в CSV или Excel. Загрузка — одна строка.
import pandas as pd
# CSV; sep=';' если разделитель — точка с запятой
df = pd.read_csv("sales.csv")
# Excel требует пакета openpyxl: pip install openpyxl
# df = pd.read_excel("sales.xlsx", sheet_name="Лист1")
# первые 5 строк — быстро посмотреть, что загрузилось
print(df.head())
# сколько строк и столбцов
print(df.shape)
# типы столбцов и число непустых значений
print(df.info())После read_csv первым делом смотрите df.info(). Там видно, какие столбцы pandas распознал как числа, а какие оставил текстом (тип object). Если сумма заказа попала в object — где-то в данных лишний пробел или запятая вместо точки, и арифметика по столбцу не сработает.
Частая проблема с кодировкой и разделителем
Русскоязычные выгрузки из 1С и старого Excel нередко идут в cp1251 и с разделителем ;. Тогда явно указывайте оба параметра:
df = pd.read_csv("sales.csv", sep=";", encoding="cp1251")Шаг 2. Выбор столбцов и строк
Один столбец — по имени в квадратных скобках, вернётся Series. Несколько — список имён, вернётся DataFrame.
# один столбец (Series)
revenue = df["revenue"]
# несколько столбцов (DataFrame)
subset = df[["region", "revenue"]]Для выбора строк по условию есть булева индексация. Условие даёт Series из True/False, по нему и фильтруется таблица.
# только заказы дороже 10000
big = df[df["revenue"] > 10000]
# два условия: скобки обязательны, & вместо and, | вместо or
big_moscow = df[(df["revenue"] > 10000) & (df["region"] == "Москва")]Почему &, а не and: and работает с одним булевым значением, а здесь сравниваются целые столбцы поэлементно. Забыть скобки вокруг каждого условия — самая частая ошибка новичка, дальше в разделе про ошибки покажу текст, который вы увидите.
loc и iloc — точечный доступ
.loc обращается по меткам (имя столбца, значение индекса), .iloc — по числовым позициям. Их путают, но правило простое: буква i в начале — значит integer, целочисленная позиция.
# строки 0-4, столбцы region и revenue по имени
df.loc[0:4, ["region", "revenue"]]
# первые 5 строк, первые 2 столбца по позиции
df.iloc[0:5, 0:2]Шаг 3. Новые столбцы и очистка
Новый столбец создаётся присваиванием. Операции над столбцами векторные — пишете как с обычными числами.
# налог 20% от выручки — сразу по всему столбцу
df["tax"] = df["revenue"] * 0.2
# заполнить пустые значения нулём
df["revenue"] = df["revenue"].fillna(0)
# убрать строки, где регион не указан
df = df.dropna(subset=["region"])Если столбец с числами загрузился как текст из-за запятых, чините так:
# '1 200,50' -> 1200.50
df["revenue"] = (
df["revenue"]
.str.replace(" ", "", regex=False) # убрать пробелы-разделители тысяч
.str.replace(",", ".", regex=False) # запятая -> точка
.astype(float)
)Шаг 4. Группировка и агрегаты
Это то, ради чего pandas обычно и берут. Задача «выручка по регионам» решается через groupby.
# сумма выручки по каждому региону
by_region = df.groupby("region")["revenue"].sum()
print(by_region)
# несколько метрик сразу
report = df.groupby("region").agg(
total=("revenue", "sum"),
orders=("revenue", "count"),
avg_check=("revenue", "mean"),
)
print(report)Синтаксис agg с именованными результатами (total=("revenue", "sum")) читается сразу: имя нового столбца, откуда берём, что считаем. Результат — DataFrame, где индексом стали названия регионов.
Отсортировать результат
# топ регионов по выручке
report.sort_values("total", ascending=False)Шаг 5. Сохранить результат
Выгрузка обратно в файл — одна строка. По умолчанию pandas пишет индекс отдельным столбцом; если он не нужен, отключите его.
# без столбца с индексом
report.to_csv("report.csv", encoding="utf-8")
# в Excel (нужен openpyxl)
report.to_excel("report.xlsx")Если не получилось
KeyError: 'region'— такого столбца нет. Проверьте точное имя черезdf.columns: часто в заголовке пробел ('region ') или другой регистр.ValueError: The truth value of a Series is ambiguous— вы написалиand/orмежду условиями или забыли скобки. Используйте&и|, каждое условие в скобках.UnicodeDecodeErrorпри read_csv — неверная кодировка. Добавьтеencoding="cp1251"илиencoding="utf-8-sig".TypeError: can only concatenate strпри умножении столбца — столбец загрузился как текст. Смотритеdf.info(), приводите к числу через.astype(float), предварительно почистив запятые и пробелы.- Предупреждение
SettingWithCopyWarning— вы меняете срез, который может быть копией. Если фильтруете, а потом присваиваете, сделайте явную копию:big = df[df["revenue"] > 10000].copy().
Что делать дальше
Вы уже умеете провести данные от файла до отчёта. Следующие шаги по мере усложнения задач: merge для соединения двух таблиц по ключу (аналог JOIN в SQL), pivot_table для сводных, pd.to_datetime и группировка по месяцам для временных рядов. Если файлы перестанут помещаться в память — смотрите в сторону чтения по частям через параметр chunksize в read_csv или библиотеки Polars. Официальная памятка «10 minutes to pandas» закрывает остаток базовых операций за один присест.
Проверка рекламы на риски: Что в макете вызовет вопросы ФАС: превосходные степени, сравнения, обещания результата, маркировка.
Спросить за 40 ₽Источники: pandas documentation — 10 minutes to pandas, pandas API reference — pandas.read_csv
Частые вопросы
У меня pandas 1.x, примеры сработают?
Чем groupby отличается от обычного цикла по строкам?
Почему нельзя писать and между двумя условиями фильтрации?
Что делать, если файл не помещается в память?
Почему появляется SettingWithCopyWarning и опасно ли это?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.