Короткий ответ
Для разных функций на разные столбцы используют df.groupby('key').agg({'col1': 'sum', 'col2': 'mean'}) или более явный синтаксис с pd.NamedAgg, который сразу задаёт понятные имена итоговых столбцов.
Как это работает подробнее
agg принимает словарь, где ключ — имя столбца, а значение — функция или список функций, применяемых именно к этому столбцу; синтаксис с NamedAgg (df.groupby('key').agg(total=pd.NamedAgg(column='col1', aggfunc='sum'), avg=pd.NamedAgg(column='col2', aggfunc='mean'))) даёт более читаемые названия результирующих столбцов, особенно если к одному столбцу применяется несколько функций.
Пример кода
question-132.py
import pandas as pd
df = pd.DataFrame({'region': ['RU', 'RU', 'US'], 'revenue': [100, 150, 200], 'delivery_days': [2, 3, 5]})
summary = df.groupby('region').agg(total_revenue=('revenue', 'sum'), avg_delivery=('delivery_days', 'mean'))
print(summary)Что использовать на практике
- Практика. такой подход удобен для построения комплексных сводных отчётов одним вызовом, например "сумма выручки, среднее время доставки и количество уникальных пользователей по региону"; при использовании nunique в качестве одной из функций стоит помнить, что это может быть заметно медленнее на больших данных, чем sum/mean.
- Проверка. для region=RU total_revenue должен быть 250, avg_delivery — 2.5, что легко проверить вручную по исходным значениям.
Подводные камни
- Частая ошибка. применяют одну и ту же функцию ко всем столбцам через .agg('sum'), хотя для некоторых столбцов (например, цена за единицу) сумма не имеет смысла и нужна скорее mean; получают многоуровневые названия столбцов (MultiIndex columns) при использовании списка функций и забывают привести их к плоскому виду перед дальнейшей обработкой или экспортом в отчёт.