pandas: группировки, соединения и упорядоченные показатели

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() с именованными агрегатами, чтобы за один раз вычислять несколько показателей с читаемыми именами столбцов.