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

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 — в бесплатном курсе, с проверкой решения.

Если используете группировки в отчётах, продолжите открытым уроком о взвешенном среднем: почему среднее по группам может дать неверный общий результат. Урок входит в платную практическую аналитику. Посмотреть продолжение.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.