TLDR; Pandas groupby.agg
verfügt über eine neue, einfachere Syntax zum Festlegen von (1) Aggregationen in mehreren Spalten und (2) mehreren Aggregationen in einer Spalte. Um dies für Pandas> = 0,25 zu tun , verwenden Sie
df.groupby('dummy').agg(Mean=('returns', 'mean'), Sum=('returns', 'sum'))
Mean Sum
dummy
1 0.036901 0.369012
ODER
df.groupby('dummy')['returns'].agg(Mean='mean', Sum='sum')
Mean Sum
dummy
1 0.036901 0.369012
Pandas hat das Verhalten GroupBy.agg
zugunsten einer intuitiveren Syntax für die Angabe benannter Aggregationen geändert . Weitere Informationen finden Sie im Abschnitt zu den 0,25-Dokumenten zu Verbesserungen sowie zu den relevanten GitHub-Problemen GH18366 und GH26512 .
Aus der Dokumentation,
Um die spaltenspezifische Aggregation mit Kontrolle über die Namen der Ausgabespalten zu unterstützen, akzeptiert pandas die spezielle Syntax in GroupBy.agg()
, die als "benannte Aggregation" bezeichnet wird
- Die Schlüsselwörter sind die Namen der Ausgabespalten
- Die Werte sind Tupel, deren erstes Element die auszuwählende Spalte und das zweite Element die auf diese Spalte anzuwendende Aggregation ist. Pandas stellt dem pandas.NamedAgg namedtuple die Felder ['column', 'aggfunc'] zur Verfügung, um die Argumente klarer zu machen. Wie üblich kann die Aggregation ein aufrufbarer oder ein String-Alias sein.
Sie können jetzt ein Tupel über Schlüsselwortargumente übergeben. Die Tupel folgen dem Format von (<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
Alternativ können Sie pd.NamedAgg
(im Wesentlichen ein benanntes Tupel) verwenden, um die Dinge expliziter zu machen.
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
Für Serien ist es noch einfacher. Übergeben Sie die aggfunc einfach an ein Schlüsselwortargument.
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
Wenn Ihre Spaltennamen keine gültigen Python-IDs sind, verwenden Sie ein Wörterbuch mit dem Entpacken:
df.groupby('kind')['height'].agg(**{'max height': 'max', ...})
Pandas <0,25
Wenn Sie in neueren Versionen von Pandas bis zu 0,24 ein Wörterbuch zum Festlegen von Spaltennamen für die Aggregationsausgabe verwenden, erhalten Sie Folgendes 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
Die Verwendung eines Wörterbuchs zum Umbenennen von Spalten ist in Version 0.20 veraltet. Bei neueren Versionen von Pandas kann dies einfacher angegeben werden, indem eine Liste von Tupeln übergeben wird. Wenn Sie die Funktionen auf diese Weise angeben , müssen alle Funktionen für diese Spalte als Tupel von (Name, Funktion) Paaren angegeben werden.
df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})
returns
op1 op2
dummy
1 0.328953 0.032895
Oder,
df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])
op1 op2
dummy
1 0.328953 0.032895