【问题标题】:Pandas groupby, sum rows, and divide sum by number of rows in groupPandas groupby,对行求和,并将总和除以组中的行数
【发布时间】:2021-05-30 03:33:00
【问题描述】:

我有一个数据框:

>>> import pandas as pd
>>>
>>> df = pd.DataFrame({
...     'P': ['P1', 'P1', 'P2', 'P2', 'P2'],
...     'A1': [0,1,2,1,2],
...     'A2': [5,4,1,3,2],
...     'A3': [5,1,3,8,4],
...     'A4': [2,1,3,4,4],
... })
>>> df
    P  A1  A2  A3  A4
0  P1   0   5   5   2
1  P1   1   4   1   1
2  P2   2   1   3   3
3  P2   1   3   8   4
4  P2   2   2   4   4
>>>

对于每个 P,我必须对 A1-A4 列求和。比这个总和除以 P 行数。 例如,每个 P 中的行数为:

>>> df.groupby('P').size()
P
P1    2
P2    3
dtype: int64
>>>

所有列的总和是:

>>> df.groupby('P').sum()
    A1  A2  A3  A4
P
P1   1   9   6   3
P2   5   6  15  11
>>>

但由于我需要按行求和,我将使用:

>>> df.groupby('P').sum().sum(axis=1)
P
P1    19
P2    37
dtype: int64
>>>

现在我必须除以 19/2(大小)和 37/3 才能得到我需要的结果。 为了做到这一点,我会准备这样的数据:

>>> pd.concat([df.groupby('P').sum().sum(axis=1), df.groupby('P').size()], axis=1)
     0  1
P
P1  19  2
P2  37  3
>>>

我可以使用 apply 来获得结果:

>>> pd.concat([df.groupby('P').sum().sum(axis=1), df.groupby('P').size()], axis=1).apply(lambda row: row[0]/row[1], axis=1)
P
P1     9.500000
P2    12.333333
dtype: float64
>>>

它有效,但我觉得我的计算过于复杂,因为我需要将行总和除以每个 P 的行数。

如果有人知道更好的方法,我会很高兴听到它。 我想至少摆脱 concat。

【问题讨论】:

    标签: python-3.x pandas dataframe pandas-groupby apply


    【解决方案1】:

    这应该可行:

    df.groupby('P').sum().sum(1) / df.groupby('P').size()
    

    【讨论】:

      【解决方案2】:

      非常绕道:

      (df.sum(numeric_only = True, axis = 1)
       .groupby(df.P)
       .pipe(lambda df: df.sum()/df.size())
       )
      
      P
      P1     9.500000
      P2    12.333333
      dtype: float64
      

      【讨论】:

        【解决方案3】:

        您可以将每个组转换为numpy ndarray 并一步将所有值相加:

        df.groupby('P').apply(lambda x: x.to_numpy().sum() / len(x))
        

        输出:

        P
        P1     9.500000
        P2    12.333333
        

        【讨论】:

        • 非常有趣的方法。谢谢。
        猜你喜欢
        • 2019-08-11
        • 2019-06-08
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-21
        • 2022-01-17
        • 1970-01-01
        相关资源
        最近更新 更多