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

groupby и transform: групповые признаки на уровне строк и фильтрация групп

Содержание курса

Добавление группового показателя как нового столбца

Процедура укладывается в два шага: вызвать transform и присвоить результат новому столбцу.

import pandas as pd

df = pd.DataFrame({
    'dept': ['HR', 'IT', 'HR', 'IT', 'HR'],
    'salary': [60000, 120000, 70000, 110000, 80000]
})

df['dept_mean'] = df.groupby('dept')['salary'].transform('mean')
df['dept_sum']  = df.groupby('dept')['salary'].transform('sum')

print(df)

Вывод:

  dept  salary   dept_mean  dept_sum
0   HR   60000   70000.0    210000
1   IT  120000  115000.0    230000
2   HR   70000   70000.0    210000
3   IT  110000  115000.0    230000
4   HR   80000   70000.0    210000

Что здесь происходит. Pandas разбивает строки по значению dept, считает среднее и сумму внутри каждой группы, а затем возвращает значение обратно в каждую строку по её исходной позиции. HR получает среднее (60000 + 70000 + 80000) / 3 = 70000, IT — (120000 + 110000) / 2 = 115000. Длина результата — ровно 5, как у исходного df.

В строку присваивания df['dept_mean'] = ... результат transform ложится без каких-либо дополнительных операций — индексы совпадают, pandas выравнивает значения автоматически.

Аргумент func в transform — строковый псевдоним агрегата: 'mean', 'sum', 'max', 'min', 'std' и другие стандартные агрегатные имена, которые принимает pandas. Передавать туда NumPy-функцию или лямбду тоже можно, но строковые имена работают быстрее, потому что pandas использует оптимизированные пути вычисления.