TLDR; Pandas groupby.agg
tiene una sintaxis nueva y más sencilla para especificar (1) agregaciones en múltiples columnas y (2) múltiples agregaciones en una columna. Entonces, para hacer esto para pandas> = 0.25 , use
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 cambiado el comportamiento de GroupBy.agg
a favor de una sintaxis más intuitiva para especificar agregaciones con nombre. Consulte la sección de documentos 0.25 sobre Mejoras , así como los problemas relevantes de GitHub GH18366 y GH26512 .
De la documentación,
Para admitir la agregación específica de columna con control sobre los nombres de las columnas de salida, pandas acepta la sintaxis especial en GroupBy.agg()
, conocida como "agregación con nombre", donde
- Las palabras clave son los nombres de las columnas de salida.
- Los valores son tuplas cuyo primer elemento es la columna a seleccionar y el segundo elemento es la agregación a aplicar a esa columna. Pandas proporciona a pandas.NamedAgg namedtuple los campos ['columna', 'aggfunc'] para que quede más claro cuáles son los argumentos. Como de costumbre, la agregación puede ser un alias invocable o de cadena.
Ahora puede pasar una tupla mediante argumentos de palabras clave. Las tuplas siguen el formato de (<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
Alternativamente, puede usar pd.NamedAgg
(esencialmente una tupla con nombre) que hace las cosas más explícitas.
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
Es aún más simple para Series, simplemente pase aggfunc a un argumento de palabra clave.
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
Por último, si los nombres de sus columnas no son identificadores de Python válidos, use un diccionario con desempaquetado:
df.groupby('kind')['height'].agg(**{'max height': 'max', ...})
Pandas <0,25
En versiones más recientes de pandas hasta 0.24, si usa un diccionario para especificar nombres de columna para la salida de agregación, obtendrá un 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
El uso de un diccionario para cambiar el nombre de las columnas está obsoleto en v0.20. En versiones más recientes de pandas, esto se puede especificar más simplemente pasando una lista de tuplas. Si especifica las funciones de esta manera, todas las funciones para esa columna deben especificarse como tuplas de pares (nombre, función).
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