2014-10-05 41 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

相关问题