【问题标题】:How to use groupby to apply multiple functions to multiple columns in Pandas?如何使用 groupby 将多个函数应用于 Pandas 中的多个列?
【发布时间】:2014-10-05 19:35:53
【问题描述】:

我有一个正常的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])

关注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) 执行此操作,然后您必须在公式中输入所有这些内容,这可能很麻烦。

假设相同的公式适用于所有列。有没有一种有效的方法来为大量列执行此操作?

谢谢

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    由于您将每个分组列聚合为一个值,因此您可以使用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
    

    或者您可以将 MultiIndex 的一级移动到索引:

    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
    

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 1970-01-01
      • 2021-12-29
      • 2013-04-23
      • 1970-01-01
      相关资源
      最近更新 更多