Python 如何使用groupby将多个函数应用于Pandas中的多个列?

Python 如何使用groupby将多个函数应用于Pandas中的多个列?,python,pandas,dataframe,group-by,Python,Pandas,Dataframe,Group By,我的df正常 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]) 接下来,我得到了我想要的结果 In [62]: A.groupby((A['A'] > 2)).apply(lambda x: pd.Series(dict( u

我的df正常

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])
接下来,我得到了我想要的结果

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
[62]中的
A.groupby((A['A']>2)).apply(lambda x:pd.Series(dict(
上升B=(x.B>=0.sum(),下降B=(x.B<0.sum(),平均B=(x.B).mean(),标准B=(x.B).std(),
上升(x.C>=0.sum(),下降(x.C<0.sum(),平均(x.C).mean(),标准(x.C).std())
出[62]:
向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下,向下
A.
假0 0 4.5 3.0000000.707107 1.414214 2
真0 0 2.0 2.333333 1.000000 1.527525 3 3
这种方法很好,但假设您必须对大量列(15-100)执行此操作,然后您必须在公式中键入所有这些内容,这可能会很麻烦

假设相同的公式适用于所有列。对于大量的列,有没有一种有效的方法可以做到这一点


谢谢

因为您要将每个分组列聚合为一个值,所以可以使用
agg
而不是
apply
。可以将函数列表作为输入。这些功能将应用于每一列:

result
具有层次(“多索引”)列。要选择特定列,可以使用:

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