2012-09-25 19 views
44

Dado el siguiente ejemplo (totalmente exageración) trama de datosPython pandas: Múltiples agregaciones de la misma columna

df = pandas.DataFrame({ 
         "date":[datetime.date(2012,x,1) for x in range(1,11)], 
         "returns":0.05*np.random.randn(10), 
         "dummy":np.repeat(1,10) 
         }) 

hay una manera incorporada existente para aplicar dos funciones de agregación diferentes para la misma columna, sin tener llamar al agg varias veces?

El sintácticamente mal, pero intuitivamente correcto, forma de hacerlo sería:

# Assume `function1` and `function2` are defined for aggregating. 
df.groupby("dummy").agg({"returns":function1, "returns":function2}) 

Obviamente, Python no permite duplicados de las llaves. ¿Hay alguna otra forma de expresar la entrada al agg? Tal vez una lista de tuplas [(column, function)] funcionaría mejor, para permitir múltiples funciones aplicadas a la misma columna? Pero parece que solo acepta un diccionario.

¿Hay una solución para esto además de definir una función auxiliar que solo aplica las dos funciones dentro de ella? (¿Cómo este trabajo con la agregación de todos modos?)

Respuesta

51

Usted puede simplemente pasar las funciones como una lista:

In [20]: df.groupby("dummy").agg({"returns": [np.mean, np.sum]}) 
Out[20]: 
     returns   
      sum  mean 

dummy      
1  0.285833 0.028583 

o como un diccionario:

In [21]: df.groupby('dummy').agg({'returns': 
            {'Mean': np.mean, 'Sum': np.sum}}) 
Out[21]: 
     returns   
      Sum  Mean 
dummy      
1  0.285833 0.028583 
+2

¿Hay alguna forma de especificar los nombres de las columnas de resultados? – Ben

+1

@Ben Creo que debes usar un cambio de nombre después. [ejemplo de Tom Augspurger (vea la celda 25)] (http://nbviewer.ipython.org/gist/TomAugspurger/6e052140eaa5fdb6e8c0) –

+1

@Ben: Agregué un ejemplo – bmu

3

¿Podría algo así como este trabajo:

In [7]: df.groupby('dummy').returns.agg({'func1' : lambda x: x.sum(), 'func2' : lambda x: x.prod()}) 
Out[7]: 
       func2  func1 
dummy       
1  -4.263768e-16 -0.188565 
+1

No, esto no funciona. Si nos fijamos en la cadena de documentación para 'aggregate', explícitamente dice que cuando se pasa un' dict', las claves deben ser nombres de columna. Entonces, o su ejemplo es algo que escribió sin verificar este error, de lo contrario, Pandas rompe sus propios documentos aquí. – ely

+0

N/M No vi la llamada adicional para 'devoluciones' allí. ¿Entonces esta es la versión de agregado de la Serie? Estoy buscando hacer la versión del agregado de DataFrame, y quiero aplicar varias agregaciones diferentes a cada columna a la vez. – ely

+0

Pruebe esto: df.groupby ('dummy'). Agg ({'returns': {'func1': lambda x: x.sum(), 'func2': lambda x: x.mean()}}) –

Cuestiones relacionadas