2014-10-05 111 views
5

我有一個正常的DF如何使用groupby將多個函數應用於Pandas中的多個列?

A = pd.DataFrame([[1, 5, 2], [2, 4, 4], [3, 3, 1], [4, 2, 2], [5, 1, 4]], 
       columns=['A', 'B', 'C'], index=[1, 2, 3, 4, 5]) 

this recipe,我得到了我想要的結果。

In [62]: A.groupby((A['A'] > 2)).apply(lambda x: pd.Series(dict(
        up_B=(x.B >= 0).sum(), down_B=(x.B < 0).sum(), mean_B=(x.B).mean(), std_B=(x.B).std(), 
        up_C=(x.C >= 0).sum(), down_C=(x.C < 0).sum(), mean_C=(x.C).mean(), std_C=(x.C).std()))) 

Out[62]: 
     down_B down_C mean_B mean_C  std_B  std_C up_B up_C 
A                  
False  0  0  4.5 3.000000 0.707107 1.414214  2  2 
True  0  0  2.0 2.333333 1.000000 1.527525  3  3 

這個方法是好的,但是想象一下,你不得不爲大量的列(15-100)做到這一點,那麼你的公式,它可以是繁瑣的輸入所有的東西。

鑑於相同的公式適用於所有列。有沒有一種有效的方法來做到這一點的大量列?

感謝

回答

9

因爲您彙總每個分組列到一個值,你可以使用agg代替applyThe agg method可以將函數列表作爲輸入。的功能將被應用到每一列

def up(x): 
    return (x >= 0).sum() 
def down(x): 
    return (x < 0).sum() 

result = A.loc[:, 'B':'C'].groupby((A['A'] > 2)).agg(
      [up, down, 'mean', 'std']) 
print(result) 

產生

 B      C       
     up down mean  std up down  mean  std 
A              
False 2 0 4.5 0.707107 2 0 3.000000 1.414214 
True 3 0 2.0 1.000000 3 0 2.333333 1.527525 

result具有分級( 「MultiIndexed」)列。要選擇某列(或列),你可以使用:

In [39]: result['B','mean'] 
Out[39]: 
A 
False 4.5 
True  2.0 
Name: (B, mean), dtype: float64 

In [46]: result[[('B', 'mean'), ('C', 'mean')]] 
Out[46]: 
     B   C 
     mean  mean 
A     
False 4.5 3.000000 
True 2.0 2.333333 

,或者你可以在多指標的一個水平移動到指數:

In [40]: result.stack() 
Out[40]: 
        B   C 
A        
False up 2.000000 2.000000 
     down 0.000000 0.000000 
     mean 4.500000 3.000000 
     std 0.707107 1.414214 
True up 3.000000 3.000000 
     down 0.000000 0.000000 
     mean 2.000000 2.333333 
     std 1.000000 1.527525 
+0

這是很清楚的。謝謝。 – hernanavella 2014-10-05 20:02:58

相關問題