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 .
З документації,
Щоб підтримувати специфічну для стовпців агрегацію з керуванням вихідними іменами стовпців, панди приймає спеціальний синтаксис в GroupBy.agg()
, відомий як "названа агрегація", де
- Ключові слова - це вихідні назви стовпців
- Значення - кортежі, першим елементом яких є стовпець для вибору, а другий елемент - це агрегація, що застосовується до цього стовпця. Pandas надає pandas.NamedAgg з именемtuple полями ['стовпець', '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
(по суті, nametuple), що робить речі більш явними.
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
Нарешті, якщо назви стовпців не є дійсними ідентифікаторами пітона, використовуйте словник з розпакуванням:
df.groupby('kind')['height'].agg(**{'max height': 'max', ...})
Панди <0,25
У останніх версіях панд, що ведуть до 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
Використання словника для перейменування стовпців застаріло в v0.20. У останніх версіях панд це можна визначити простіше, передавши список кортежів. Якщо вказати функції таким чином, всі функції для цього стовпця потрібно вказати як кортежі пар (ім'я, функція).
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