TLDR; Pandy groupby.agg
ma nową, łatwiejszą składnię do określania (1) agregacji w wielu kolumnach i (2) wielu agregacji w kolumnie. Aby to zrobić dla pand> = 0,25 , użyj
df.groupby('dummy').agg(Mean=('returns', 'mean'), Sum=('returns', 'sum'))
Mean Sum
dummy
1 0.036901 0.369012
LUB
df.groupby('dummy')['returns'].agg(Mean='mean', Sum='sum')
Mean Sum
dummy
1 0.036901 0.369012
Pandy zmieniły zachowanie GroupBy.agg
na rzecz bardziej intuicyjnej składni do określania nazwanych agregacji. Zobacz sekcję 0.25 docs dotyczącą ulepszeń, a także istotne problemy z GitHub GH18366 i GH26512 .
Z dokumentacji,
Aby obsługiwać agregację specyficzną dla kolumny z kontrolą nad nazwami kolumn wyjściowych, pandy akceptuje specjalną składnię w GroupBy.agg()
, znaną jako „nazwane agregowanie”, gdzie
- Słowa kluczowe to nazwy kolumn wyjściowych
- Wartości to krotki, których pierwszym elementem jest kolumna do wybrania, a drugim elementem jest agregacja do zastosowania w tej kolumnie. Pandas dostarcza pandas.NamedAgg namedtuple z polami ['column', 'aggfunc'], aby lepiej zrozumieć, jakie są argumenty. Jak zwykle agregacja może być aliasem wywoływalnym lub ciągiem.
Możesz teraz przekazać krotkę za pomocą argumentów słów kluczowych. Krotki mają format (<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
Alternatywnie możesz użyć pd.NamedAgg
(zasadniczo nazwanego tupli), co czyni rzeczy bardziej wyraźnymi.
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
W przypadku Series jest to jeszcze prostsze, wystarczy przekazać funkcję aggfunc do argumentu słowa kluczowego.
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
Na koniec, jeśli nazwy kolumn nie są prawidłowymi identyfikatorami Pythona, użyj słownika z rozpakowywaniem:
df.groupby('kind')['height'].agg(**{'max height': 'max', ...})
Pandy <0,25
W nowszych wersjach pand prowadzących do 0,24, jeśli używasz słownika do określania nazw kolumn dla danych wyjściowych agregacji, otrzymasz 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
Używanie słownika do zmiany nazw kolumn jest przestarzałe w wersji 0.20. W nowszych wersjach pand można to określić prościej, przekazując listę krotek. Jeśli określasz funkcje w ten sposób, wszystkie funkcje dla tej kolumny muszą być określone jako krotki par (nazwa, funkcja).
df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})
returns
op1 op2
dummy
1 0.328953 0.032895
Lub,
df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])
op1 op2
dummy
1 0.328953 0.032895