Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pandas how to apply multiple functions to dataframe

Tags:

Is there a way to apply a list of functions to each column in a DataFrame like the DataFrameGroupBy.agg function does? I found an ugly way to do it like this:

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 
like image 462
devan0 Avatar asked Mar 02 '14 13:03

devan0


2 Answers

For Pandas 0.20.0 or newer, use df.agg (thanks to ayhan for pointing this out):

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

For older versions, you could use

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 

Another way would be:

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 
like image 130
unutbu Avatar answered Oct 21 '22 09:10

unutbu


In the general case where you have arbitrary functions and column names, you could do this:

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 
like image 26
Doctor J Avatar answered Oct 21 '22 11:10

Doctor J