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