groupby и agg: сводные показатели с явными именами агрегатов
Содержание курса
До этого урока мы работали с данными построчно или целыми столбцами. Теперь задача другая: не просто посчитать среднее по всей таблице, а получить отдельный агрегат для каждой группы строк — например, суммарные продажи по каждому региону или среднюю цену по каждой категории товара. Именно для этого нужен groupby.
groupby по одному столбцу: механика разбиения и индекс результата
Когда пишешь df.groupby('region'), pandas не вычисляет ничего сразу. Он разбивает DataFrame на группы — по одной на каждое уникальное значение столбца region — и возвращает объект DataFrameGroupBy. Это просто инструкция «как делить»; результат появится только после вызова агрегирующего метода.
Посмотрим на минимальном примере:
import pandas as pd
df = pd.DataFrame({
'region': ['Север', 'Юг', 'Север', 'Юг', 'Север'],
'sales': [100, 200, 150, 300, 80]
})
result = df.groupby('region')['sales'].sum()
print(result)
Вывод:
region Север 330 Юг 500 Name: sales, dtype: int64
Обрати внимание: region здесь не столбец, а индекс результата. Pandas переносит ключ группировки в индекс по умолчанию — это сознательное поведение, а не баг. Пока это Series, всё выглядит терпимо. Но когда результат становится DataFrame с несколькими агрегатами, индекс в роли ключа создаёт неудобства: ключ пропадает из result.columns, и дальнейшая работа с таблицей усложняется.
Чтобы ключ остался обычным столбцом, используй параметр as_index=False:
result = df.groupby('region', as_index=False)['sales'].sum()
print(result)
print(result.columns.tolist())
Вывод:
region sales
0 Север 330
1 Юг 500
['region', 'sales']
Теперь region — обычный столбец с целочисленным RangeIndex. Именно эта форма удобна для дальнейшей фильтрации, сортировки или объединения таблиц.
Концептуально groupby делает три шага: split — разбивает DataFrame на группы по значениям ключевого столбца; apply — применяет агрегирующую функцию к каждой группе; combine — собирает результаты в одну таблицу. Этот паттерн split-apply-combine лежит в основе всей работы с groupby в pandas.
В следующем разделе мы подключим к groupby вызов .agg() с именованными агрегатами, чтобы за один раз вычислять несколько показателей с читаемыми именами столбцов.
