TLDR; Pandas groupby.agg
имеет новый, более простой синтаксис для указания (1) агрегатов для нескольких столбцов и (2) множественных агрегатов для столбца. Итак, чтобы сделать это для панд> = 0,25 , используйте
df.groupby('dummy').agg(Mean=('returns', 'mean'), Sum=('returns', 'sum'))
Mean Sum
dummy
1 0.036901 0.369012
ИЛИ
df.groupby('dummy')['returns'].agg(Mean='mean', Sum='sum')
Mean Sum
dummy
1 0.036901 0.369012
Pandas изменил поведение GroupBy.agg
в пользу более интуитивного синтаксиса для указания именованных агрегатов. См. Раздел документации 0.25 по улучшениям, а также соответствующие проблемы GitHub GH18366 и GH26512 .
Из документации,
Для поддержки агрегации по столбцу с контролем над именами выходных столбцов pandas принимает специальный синтаксис GroupBy.agg()
, известный как «именованная агрегация», где
- Ключевые слова - это имена выходных столбцов.
- Значения представляют собой кортежи, первый элемент которых является столбцом для выбора, а второй элемент - агрегированием, применяемым к этому столбцу. Pandas предоставляет именованный кортеж pandas.NamedAgg с полями ['column', 'aggfunc'], чтобы было понятнее, каковы аргументы. Как обычно, агрегирование может быть вызываемым или строковым псевдонимом.
Теперь вы можете передать кортеж через аргументы ключевого слова. Кортежи соответствуют формату (<colName>, <aggFunc>)
.
import pandas as pd
pd.__version__
# '0.25.0.dev0+840.g989f912ee'
# Setup
df = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
'height': [9.1, 6.0, 9.5, 34.0],
'weight': [7.9, 7.5, 9.9, 198.0]
})
df.groupby('kind').agg(
max_height=('height', 'max'), min_weight=('weight', 'min'),)
max_height min_weight
kind
cat 9.5 7.9
dog 34.0 7.5
В качестве альтернативы вы можете использовать pd.NamedAgg
(по сути именованный кортеж), который делает вещи более явными.
df.groupby('kind').agg(
max_height=pd.NamedAgg(column='height', aggfunc='max'),
min_weight=pd.NamedAgg(column='weight', aggfunc='min')
)
max_height min_weight
kind
cat 9.5 7.9
dog 34.0 7.5
Для Series это еще проще, просто передайте aggfunc аргументу ключевого слова.
df.groupby('kind')['height'].agg(max_height='max', min_height='min')
max_height min_height
kind
cat 9.5 9.1
dog 34.0 6.0
Наконец, если имена ваших столбцов не являются действительными идентификаторами Python, используйте словарь с распаковкой:
df.groupby('kind')['height'].agg(**{'max height': 'max', ...})
Панды <0,25
В более поздних версиях pandas, предшествующих 0.24, при использовании словаря для указания имен столбцов для вывода агрегации вы получите FutureWarning
:
df.groupby('dummy').agg({'returns': {'Mean': 'mean', 'Sum': 'sum'}})
# FutureWarning: using a dict with renaming is deprecated and will be removed
# in a future version
Использование словаря для переименования столбцов не рекомендуется в версии 0.20. В более поздних версиях pandas это можно указать проще, передав список кортежей. При указании функций таким образом, все функции для этого столбца должны быть указаны как кортежи пар (имя, функция).
df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})
returns
op1 op2
dummy
1 0.328953 0.032895
Или,
df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])
op1 op2
dummy
1 0.328953 0.032895