2 回答

TA贡献1825条经验 获得超6个赞
您可以像这样计算最后 5 个的总和:
df["rolling As"] = df[df['id'] == 'a'].rolling(window=5).sum()["values"]
(这包括当前行作为 5 行之一。不确定这是否是您想要的)
id values rolling As
0 a 5 NaN
1 a 10 NaN
2 a 10 NaN
3 b 2 NaN
4 c 2 NaN
5 d 5 NaN
6 a 10 NaN
7 a 20 55.0
8 a 10 60.0
9 a 10 60.0
10 a 15 65.0
11 a 20 75.0
如果你不想包含它。你可以转移
df["rolling"] = df[df['id'] == 'a'].rolling(window=5).sum()["values"].shift()
给予:
id values rolling
0 a 5 NaN
1 a 10 NaN
2 a 10 NaN
3 b 2 NaN
4 c 2 NaN
5 d 5 NaN
6 a 10 NaN
7 a 20 NaN
8 a 10 55.0
9 a 10 60.0
10 a 15 60.0
11 a 20 65.0

TA贡献1842条经验 获得超21个赞
尝试使用groupby, transform, 和rolling:
df['sum(x.tail(5))'] = df.groupby('id')['values']\
.transform(lambda x: x.rolling(5, min_periods=5).sum().shift())
输出:
id values sum(x.tail(5))
1 a 5 NaN
2 a 10 NaN
3 a 10 NaN
4 b 2 NaN
5 c 2 NaN
6 d 2 NaN
7 a 5 NaN
8 a 10 NaN
9 a 20 40.0
10 a 10 55.0
11 a 15 55.0
12 a 20 60.0
添加回答
举报