如何在Pandas中实现含当前元素的后续N行滚动求和?
解决DataFrame中包含当前元素的后续n行求和问题
嘿,我来帮你搞定这个需求!你想要计算列a中每个元素包含自身在内的后续n行(这里n=3)的和,当后续不足n行时用0补位,对吧?先看看你之前的代码问题出在哪,再给你两种可行的解法。
问题分析
你之前用的pd.rolling_sum(b.a, n) + a逻辑不对:
pd.rolling_sum(现在pandas更推荐用b['a'].rolling(n).sum())是向前的滚动窗口求和,比如n=2时,索引1的结果是1+2=3,再加a[1]=2得到5,这和你要的「当前+后两个元素」的方向完全相反。- 同时也没处理后续行不足时的补0逻辑,导致开头出现NaN,结果不符合预期。
通用解法(适配任意n值)
如果n可能变化,推荐用反转数据+滚动求和+再反转的方法,这样不管n是多少都能轻松实现:
import pandas as pd a = [1,2,3,4,5,6] b = pd.DataFrame({'a': a}) n = 3 # 这里设置你需要的窗口大小(包含当前行在内的总行数) # 核心逻辑:反转后计算滚动和,再反转回来,不足的位置补0 b['r'] = b['a'][::-1].rolling(window=n, min_periods=1).sum()[::-1].fillna(0) print(b)
运行后得到的结果完全符合你的期望:
a r 0 1 6.0 1 2 9.0 2 3 12.0 3 4 15.0 4 5 11.0 5 6 6.0
代码解释:
b['a'][::-1]:把列a的顺序反转,让原来的最后一行变成第一行rolling(window=n, min_periods=1):设置滚动窗口大小为n,min_periods=1保证即使窗口内不足n个元素也会计算求和[::-1]:把求和后的结果再反转回来,就得到了从当前行开始往后n行的和(包含当前行)fillna(0):把后续没有足够行的位置用0填充,满足你期望的补0逻辑
固定n值的简化写法
如果n是固定的(比如就是3),也可以直接用shift方法逐个相加,写法更直观:
b['r'] = b['a'] + b['a'].shift(-1).fillna(0) + b['a'].shift(-2).fillna(0)
这个方法的原理是:
b['a'].shift(-1):把列a向下移动一位,得到当前行的下一行元素b['a'].shift(-2):得到当前行的下两行元素- 用
fillna(0)把不存在的位置补0,最后和当前行元素相加,就得到了目标结果
内容的提问来源于stack exchange,提问作者Alessandro Ceccarelli
相关产品推荐
相关产品推荐

