groupby и transform: групповые признаки на уровне строк и фильтрация групп
Содержание курса
Типичная ошибка: agg вместо transform при создании группового признака
Когда нужно добавить в DataFrame столбец с групповым средним, иногда пишут через agg — по аналогии с тем, как только что считали сводные показатели. Код выглядит похоже, но результат оказывается полностью сломан.
import pandas as pd
df = pd.DataFrame({
'dept': ['HR', 'IT', 'HR', 'IT', 'HR'],
'salary': [60000, 120000, 70000, 110000, 80000]
})
# Неверный вариант: agg вместо transform
df['dept_mean_wrong'] = df.groupby('dept')['salary'].agg('mean')
print(df)
Вывод:
dept salary dept_mean_wrong 0 HR 60000 NaN 1 IT 120000 NaN 2 HR 70000 NaN 3 IT 110000 NaN 4 HR 80000 NaN
Почему все значения — NaN. agg('mean') возвращает Series с двумя элементами и индексом ['HR', 'IT']: это метки групп, а не позиции строк. Исходный df имеет числовой индекс [0, 1, 2, 3, 4]. Когда pandas присваивает Series в столбец, он выравнивает значения по меткам индекса. Метка 'HR' не совпадает ни с одной из меток 0..4, метка 'IT' — тоже. Совпадений нет вообще, поэтому все пять строк получают NaN. Pandas не сообщает об ошибке — он молча выполняет присваивание, и баг легко пропустить без проверки результата.
Исправление прямое: заменить agg на transform.
# Верный вариант
df['dept_mean'] = df.groupby('dept')['salary'].transform('mean')
print(df[['dept', 'salary', 'dept_mean']])
Вывод:
dept salary dept_mean 0 HR 60000 70000.0 1 IT 120000 115000.0 2 HR 70000 70000.0 3 IT 110000 115000.0 4 HR 80000 70000.0
transform возвращает Series длиной 5 с числовым индексом [0, 1, 2, 3, 4] — точно как у df. Выравнивание при присваивании проходит корректно, каждая строка получает среднее своей группы.
Правило простое: если нужен групповой показатель как столбец в исходной таблице — transform. Если нужна сводная статистика отдельной таблицей — agg.
Попробуйте сами. Отберите строки магазинов, суммарная выручка которых превышает порог, сохранив исходную детализацию. Решить задачу на transform — в бесплатном курсе, с проверкой решения.
Если используете группировки в отчётах, продолжите открытым уроком о взвешенном среднем: почему среднее по группам может дать неверный общий результат. Урок входит в платную практическую аналитику. Посмотреть продолжение.
