使用 pandas 一次分配多个滚动总和

assign multiple rolling sums at once with pandas

我有一个数据框,其中一列有计数,我想一次分配该列的多个累积和。我尝试了下面的代码,但不幸的是它只给了我所有列的最后累积总和。

d = pd.DataFrame({'counts':[242,99,2,13,0]})
kwargs = {f"cumulative_{i}" : lambda x: x['counts'].shift(1).rolling(i).sum() for i in range(1,4)}
d.assign(**kwargs)

这就是它给我的东西

counts  cumulative_1    cumulative_2    cumulative_3
0   242     NaN                NaN                 NaN
1   99      NaN                NaN                 NaN
2   2       NaN                NaN                 NaN
3   13      343.0              343.0               343.0
4   0       114.0              114.0               114.0

但我想得到这个

counts  cumulative_1    cumulative_2    cumulative_3
0   242     NaN                NaN                 NaN
1   99      242.0              NaN                 NaN
2   2       99.0               341.0               NaN
3   13      2.0                101.0               343.0
4   0       13.0               15.0                114.0

我可以更改什么以获得上述内容?

lambda 中定义的变量 i 具有全局作用域,它不会在 lambda 定义中被捕获,即它总是被计算为 3,即循环结束时的最后一个值。为了在定义时捕获 i,您可以定义一个包装函数,为循环的每次迭代捕获 i 和 returns 可以推断正确 i 的 lambda从它的封闭环境:

def roll_i(i):
    return lambda x: x['counts'].shift(1).rolling(i).sum()

kwargs = {f"cumulative_{i}" : roll_i(i) for i in range(1,4)}
d.assign(**kwargs)

   counts  cumulative_1  cumulative_2  cumulative_3
0     242           NaN           NaN           NaN
1      99         242.0           NaN           NaN
2       2          99.0         341.0           NaN
3      13           2.0         101.0         343.0
4       0          13.0          15.0         114.0