TLDR; Pandas groupby.agg
ha una nuova sintassi più semplice per specificare (1) aggregazioni su più colonne e (2) più aggregazioni su una colonna. Quindi, per fare questo per i panda> = 0,25 , usa
df.groupby('dummy').agg(Mean=('returns', 'mean'), Sum=('returns', 'sum'))
Mean Sum
dummy
1 0.036901 0.369012
O
df.groupby('dummy')['returns'].agg(Mean='mean', Sum='sum')
Mean Sum
dummy
1 0.036901 0.369012
Pandas ha cambiato il comportamento di GroupBy.agg
a favore di una sintassi più intuitiva per la specifica di aggregazioni denominate. Consulta la sezione dei documenti 0.25 sui miglioramenti e sui problemi rilevanti di GitHub GH18366 e GH26512 .
Dalla documentazione,
Per supportare l'aggregazione specifica della colonna con il controllo sui nomi delle colonne di output, pandas accetta la sintassi speciale in GroupBy.agg()
, nota come "aggregazione denominata", dove
- Le parole chiave sono i nomi delle colonne di output
- I valori sono tuple il cui primo elemento è la colonna da selezionare e il secondo elemento è l'aggregazione da applicare a quella colonna. Pandas fornisce a pandas.NamedAgg namedtuple i campi ['column', 'aggfunc'] per rendere più chiaro quali sono gli argomenti. Come al solito, l'aggregazione può essere un alias richiamabile o una stringa.
È ora possibile passare una tupla tramite argomenti di parole chiave. Le tuple seguono il formato di (<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
In alternativa, puoi usare pd.NamedAgg
(essenzialmente una namedtuple) che rende le cose più esplicite.
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
È ancora più semplice per Series, basta passare l'aggfunc a un argomento di parola chiave.
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
Infine, se i nomi delle colonne non sono identificatori python validi, usa un dizionario con decompressione:
df.groupby('kind')['height'].agg(**{'max height': 'max', ...})
Panda <0,25
Nelle versioni più recenti dei panda che portano fino a 0.24, se si utilizza un dizionario per specificare i nomi delle colonne per l'output di aggregazione, si otterrà 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
L'utilizzo di un dizionario per rinominare le colonne è deprecato nella v0.20. Nelle versioni più recenti dei panda, questo può essere specificato più semplicemente passando un elenco di tuple. Se si specificano le funzioni in questo modo, tutte le funzioni per quella colonna devono essere specificate come tuple di coppie (nome, funzione).
df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})
returns
op1 op2
dummy
1 0.328953 0.032895
O,
df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])
op1 op2
dummy
1 0.328953 0.032895