2014-03-02 143 views
11

有沒有辦法像DataFrameGroupBy.agg函數一樣將函數列表應用於DataFrame中的每一列?我發現了一個醜陋的方式做到這一點是這樣的:熊貓如何將多個函數應用於數據框

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 

回答

11

大熊貓0.20.0或更新的版本,使用df.agg(感謝艾漢的pointing this out):

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

對於舊版本,你可以使用

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 

另一種方法是:

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 
+1

'agg'現在可以作爲一個數據幀的方法所以這個作品,未經伎倆:'df.agg( ['mean','std'])''。 – ayhan

+0

@ayhan:非常感謝您的改進。 – unutbu

5

在你有任意函數和列名一般情況下,你可以這樣做:

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 
相關問題