define aggfunc para cada columna de valores en la tabla dinámica de pandas

Estaba intentando generar una tabla dinámica con múltiples columnas de “valores”. Sé que puedo usar aggfunc para agregar valores de la manera que quiero, pero qué pasa si no quiero sumr o promediar ambas columnas sino que quiero la sum de una columna mientras que la media de la otra. Entonces, ¿es posible hacerlo usando pandas?

df = pd.DataFrame({ 'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D' : np.random.randn(24), 'E' : np.random.randn(24) }) 

Ahora esto obtendrá una tabla dinámica con sum:

 pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.sum) 

Y esto por medio:

 pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.mean) 

¿Cómo puedo obtener la sum para D y la media para E ?

Espero que mi pregunta sea lo suficientemente clara.

Puedes concat dos DataFrames :

 >>> df1 = pd.pivot_table(df, values=['D'], rows=['B'], aggfunc=np.sum) >>> df2 = pd.pivot_table(df, values=['E'], rows=['B'], aggfunc=np.mean) >>> pd.concat((df1, df2), axis=1) DE BA 1.810847 -0.524178 B 2.762190 -0.443031 C 0.867519 0.078460 

o puede pasar la lista de funciones como parámetro aggfunc y luego reindexar:

 >>> df3 = pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=[np.sum, np.mean]) >>> df3 sum mean DEDE BA 1.810847 -4.193425 0.226356 -0.524178 B 2.762190 -3.544245 0.345274 -0.443031 C 0.867519 0.627677 0.108440 0.078460 >>> df3 = df3.ix[:, [('sum', 'D'), ('mean','E')]] >>> df3.columns = ['D', 'E'] >>> df3 DE BA 1.810847 -0.524178 B 2.762190 -0.443031 C 0.867519 0.078460 

Alghouth, sería bueno tener una opción para aggfunc para cada columna individualmente. No sé cómo podría hacerse, se puede pasar a aggfunc parámetro similar a un aggfunc , como {'D':np.mean, 'E':np.sum} .

En realidad, en tu caso puedes pivotar a mano :

 >>> df.groupby('B').aggregate({'D':np.sum, 'E':np.mean}) ED BA -0.524178 1.810847 B -0.443031 2.762190 C 0.078460 0.867519 

Puede aplicar una función específica a una columna específica pasando un dict.

 pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc={'D':np.sum, 'E':np.mean}) 
 table = pivot_table(df, values=['D', 'E'], index=['A', 'C'], aggfunc={'D': np.mean,'E': np.sum}) 

tabla DE media sum AC bar grande 5.500000 7.500000 pequeño 5.500000 8.500000 foo grande 2.000000 4.500000 pequeño 2.333333 4.333333