¿Existe una forma integrada de pandas para aplicar dos funciones de agregación diferentes f1, f2
a la misma columna df["returns"]
, sin tener que llamar agg()
varias veces?
Marco de datos de ejemplo:
import pandas as pd
import datetime as dt
pd.np.random.seed(0)
df = pd.DataFrame({
"date" : [dt.date(2012, x, 1) for x in range(1, 11)],
"returns" : 0.05 * np.random.randn(10),
"dummy" : np.repeat(1, 10)
})
La forma sintácticamente incorrecta, pero intuitivamente correcta, de hacerlo sería:
# Assume `f1` and `f2` are defined for aggregating.
df.groupby("dummy").agg({"returns": f1, "returns": f2})
Obviamente, Python no permite claves duplicadas. ¿Hay alguna otra forma de expresar la entrada agg()
? ¿Quizás una lista de tuplas [(column, function)]
funcionaría mejor para permitir múltiples funciones aplicadas a la misma columna? Pero agg()
parece que solo acepta un diccionario.
¿Hay alguna solución para esto además de definir una función auxiliar que solo aplique ambas funciones dentro de ella? (¿Cómo funcionaría esto con la agregación de todos modos?)
Respuestas:
Simplemente puede pasar las funciones como una lista:
o como diccionario:
fuente
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 , useO
Pandas> = 0,25: Agregación con nombre
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,
Ahora puede pasar una tupla mediante argumentos de palabras clave. Las tuplas siguen el formato de
(<colName>, <aggFunc>)
.Alternativamente, puede usar
pd.NamedAgg
(esencialmente una tupla con nombre) que hace las cosas más explícitas.Es aún más simple para Series, simplemente pase aggfunc a un argumento de palabra clave.
Por último, si los nombres de sus columnas no son identificadores de Python válidos, use un diccionario con desempaquetado:
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
: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).
O,
fuente
df.groupby('kind')['height']
?df.groupby("kind").agg(**{ 'max height': pd.NamedAgg(column='height', aggfunc=max), 'min weight': pd.NamedAgg(column='weight', aggfunc=min) })
Algo como esto funcionaría:
fuente
aggregate
, dice explícitamente que cuandodict
se pasa a, las claves deben ser nombres de columna. Entonces, o su ejemplo es algo que escribió sin verificar este error, o Pandas rompe sus propios documentos aquí.returns
allí. Entonces, ¿esta es la versión en serie del agregado? Estoy buscando hacer la versión DataFrame de agregado, y quiero aplicar varias agregaciones diferentes a cada columna a la vez.