如何计算熊猫数据框中不同大小的子集的均值?

时间:2019-10-13 15:49:57

标签: pandas dataframe subset mean

为pandas数据框中的行的每个唯一子集计算特定列的平均值。在下面的示例中,每个子集直到1出现在“标记”列中,即(54 + 34 + 78 + 91 + 29)/ 5 = 57.2和(81 + 44 + 61)/ 3 = 62.0

当前无法根据特定的列条件计算不同大小的滚动子集


>>> import pandas as pd
>>> df = pd.DataFrame({"Indx": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "Units": [54, 34, 78, 91, 29, 81, 44, 61, 73, 19], "Flag": [0, 0, 0, 0, 1, 0, 0, 1, 0, 1]})
>>> df
   Indx  Units  Flag
0     1     54     0
1     2     34     0
2     3     78     0
3     4     91     0
4     5     29     1
5     6     81     0
6     7     44     0
7     8     61     1
8     9     73     0
9    10     19     1

# DESIRED OUTPUT
>>> df
   Indx  Units  Flag   avg
0     1     54     0  57.2
1     2     34     0  57.2
2     3     78     0  57.2
3     4     91     0  57.2
4     5     29     1  57.2
5     6     81     0  62.0
6     7     44     0  62.0
7     8     61     1  62.0
8     9     73     0  46.0
9    10     19     0  46.0

2 个答案:

答案 0 :(得分:2)

依次使用cumsumtransform来创建组密钥

df['Units'].groupby(df.Flag.iloc[::-1].cumsum()).transform('mean')
0    57.2
1    57.2
2    57.2
3    57.2
4    57.2
5    62.0
6    62.0
7    62.0
8    46.0
9    46.0
Name: Units, dtype: float64

#df['new']=df['Units'].groupby(df.Flag.iloc[::-1].cumsum()).transform('mean')

答案 1 :(得分:0)

(我认为)最短的解决方案是:

df['avg'] = df.groupby(df.Flag[::-1].cumsum()).Units.transform('mean')

您甚至不需要使用 iloc ,因为 df.Flag [::-1] 会检索 Flag 列以相反的顺序。