为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
答案 0 :(得分:2)
依次使用cumsum
和transform
来创建组密钥
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 列以相反的顺序。