Python 3.x Pandas groupby、求和行数,以及将求和除以组中的行数

Python 3.x Pandas groupby、求和行数,以及将求和除以组中的行数,python-3.x,pandas,dataframe,pandas-groupby,apply,Python 3.x,Pandas,Dataframe,Pandas Groupby,Apply,我有一个数据帧: >>> 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], ... }) &g

我有一个数据帧:

>>> 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
>>>
所有COL的总和为:

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

这应该可以:

df.groupby('P').sum().sum(1) / df.groupby('P').size()
非常绕道:

(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

您可以将每个组转换为
numpy
ndarray,并在一个步骤中求和所有值:

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

P
P1     9.500000
P2    12.333333

非常有趣的方法。谢谢