Pandas cómo aplicar múltiples funciones al dataframe.

¿Hay una manera de aplicar una lista de funciones a cada columna en un DataFrame como lo hace la función DataFrameGroupBy.agg? Encontré una manera fea de hacerlo así:

df=pd.DataFrame(dict(one=np.random.uniform(0,10,100), two=np.random.uniform(0,10,100))) df.groupby(np.ones(len(df))).agg(['mean','std']) one two mean std mean std 1 4.802849 2.729528 5.487576 2.890371 

Para Pandas 0.20.0 o más reciente, use df.agg (gracias a ayhan por señalar esto ):

 In [11]: df.agg(['mean', 'std']) Out[11]: one two mean 5.147471 4.964100 std 2.971106 2.753578 

Para versiones anteriores, podrías usar

 In [61]: df.groupby(lambda idx: 0).agg(['mean','std']) Out[61]: one two mean std mean std 0 5.147471 2.971106 4.9641 2.753578 

Otra forma sería:

 In [68]: pd.DataFrame({col: [getattr(df[col], func)() for func in ('mean', 'std')] for col in df}, index=('mean', 'std')) Out[68]: one two mean 5.147471 4.964100 std 2.971106 2.753578 

En el caso general donde tiene funciones arbitrarias y nombres de columna, puede hacer esto:

 df.apply(lambda r: pd.Series({'mean': r.mean(), 'std': r.std()})).transpose() mean std one 5.366303 2.612738 two 4.858691 2.986567 

Estoy usando pandas para analizar borradores de la legislación chilena. En mi dataframe, la lista de autores se almacena como una cadena. La respuesta anterior no me funcionó (usando pandas 0.20.3). Así que usé mi propia lógica y se me ocurrió esto:

 df.authors.apply(eval).apply(len).sum() 

Concatenado aplica! Un oleoducto !! Las primeras transformaciones de aplicación.

 "['Barros Montero: Ramón', 'Bellolio Avaria: Jaime', 'Gahona Salazar: Sergio']" 

en la lista obvia, la segunda aplicación cuenta el número de legisladores involucrados en el proyecto. Quiero el tamaño de cada par (legislador, número de proyecto) (así puedo prescribir una matriz donde estudiaré qué partes trabajan en qué).

Curiosamente, esto funciona! Aún más interesante, esa última llamada falla si uno se vuelve demasiado ambicioso y hace esto en su lugar:

 df.autores.apply(eval).apply(len).apply(sum) 

con un error:

 TypeError: 'int' object is not iterable 

desde lo profundo de /site-packages/pandas/core/series.py en apply