Применение двух функций к одному столбцу в pandas
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для выполнения множественного агрегирования одного столбца в DataFrame из библиотеки pandas, воспользуйтесь методом GroupBy.agg()
. Ему следует передать словарь, где ключами будут названия столбцов, а значениями — список функций агрегации:
agg_result = df.groupby('key')['value'].agg({
'total': 'sum', # Суммируем значения
'average': 'mean', # Вычисляем среднее
'peak': 'max' # Находим максимум
})
В результате вы получите DataFrame с колонками total, average и peak для столбца 'value' каждого уникального ключа.
Упростим процесс с pandas >= 0.25
С версии pandas 0.25 доступен удобный синтаксис именованного агрегирования, который делает код более читаемым:
agg_result = df.groupby('key').agg(
total=pd.NamedAgg(column='value', aggfunc='sum'),
average=pd.NamedAgg(column='value', aggfunc='mean'),
peak=pd.NamedAgg(column='value', aggfunc='max')
)
Оба приведенных примера выполняют одно и то же, но благодаря классу NamedAgg второй вариант выглядит нагляднее.
Нестандартная агрегация: почему бы и нет?
Если требуется провести агрегацию с использованием специфических функций, например, если у вас есть собственная функция, можно использовать лямбда-выражения:
agg_result = df.groupby('key')['value'].agg({
'range': lambda x: x.max() – x.min(), # Вычисляем размах
'variance': lambda x: x.var() # И дисперсию
})
Таким подходом можно определить диапазон и вариативность для каждой группы, не прибегая к использованию новых функций.
Учитываем версионные различия: версия pandas важна
Стоит помнить, что ваш код может исполняться на различных версиях pandas, и с течением времени синтаксис может изменяться. Следите за предупреждениями об устаревшем коде и стремитесь писать устойчивый код.
Визуализация
Множественное агрегирование одного столбца в DataFrame можно ассоциировать с выбором различных блюд в буфете:
+------ Столбец 'value' ------+
| |
| [🥘] Сумма => 💰 |
| [🍚] Среднее => 📈 |
| [🥗] Максимум => 🚀 |
| [🍣] Своё => 🧪 |
| |
+-----------------------------+
Используя pandas, вы можете "отведать" эти гастрономические "вкусы":
df.groupby('key')['value'].agg([
('💰', 'sum'),
('📈', 'mean'),
('🚀', 'max'),
('🧪', lambda x: x.median() – x.mean()) # Еще один пользовательский вариант
])
Теперь в вашем DataFrame представлены разные виды агрегаций. Приятного "проглатывания" данных!
Сохранение оригинального группового индекса
Если вы не хотите, чтобы столбец группировки стал индексом, используйте параметр as_index=False
:
df.groupby('key', as_index=False)['value'].agg(
Mean=('value', 'mean'),
Range=lambda x: x.max() – x.min() # Здесь вычисляется диапазон
)
Таким образом, вы получите DataFrame, где ключ группировки останется отдельным столбцом.
Приведение в порядок столбцов MultiIndex
После именованной агрегации столбцы DataFrame могут образовывать структуру MultiIndex. Привести её в порядок можно следующим образом:
result = df.groupby('key').agg(
Mean=pd.NamedAgg(column='value', aggfunc='mean'),
Sum=pd.NamedAgg(column='value', aggfunc='sum')
)
result.columns = ['_'.join(col).strip() for col in result.columns.values] # Теперь структура порядка столбцов прозрачна и понятна
Эффективное программирование с использованием цепей методов
Цепочки методов позволяют писать чистый и эффективный код:
(df
.groupby('key', as_index=False)
.agg(mean_value=('value', 'mean'), sum_value=('value', 'sum'))
.assign(ratio=lambda x: x['sum_value'] / x['mean_value'])
)
Последовательное применение методов позволяет избавиться от необходимости во временных переменных и делает код более сжатым.
Полезные материалы
- pandas.DataFrame.groupby — исследуйте возможности метода
groupby
, заглянув в документацию. - pandas GroupBy — подробная статья о применении метода
groupby
. - Aggregation and Grouping — узнайте о тонкостях агрегации данных.
- pandas.DataFrame.agg — подробное описание метода
agg
. - Применение нескольких функций — обсуждение множественного применения функций в
groupby
. - Овладение pandas GroupBy — глубокий разбор возможностей pandas
GroupBy
для эффективного анализа данных.