Pandas滚动求和:将窗口计算值置于窗口起始位置的实现方法
嘿,这个需求我刚好踩过坑!Pandas的rolling方法默认确实把计算结果放在窗口的末尾,但要把滚动求和的结果挪到窗口的起始位置,完全不用写循环,用Pandas自带的方法组合就能搞定,我给你两种实用的方案:
方案1:滚动求和 + 移位操作(最直观)
核心思路是先按默认方式计算滚动窗口的求和结果(放在窗口末尾),再通过shift()方法把结果往前移动「窗口大小-1」的步长,这样就刚好对应到窗口的起始位置了。
举个具体的例子,假设我们有这样的DataFrame:
import pandas as pd df = pd.DataFrame({'value': [1, 2, 3, 4, 5, 6, 7, 8]}) window_size = 4 # 窗口大小为4
执行以下代码:
# 第一步:计算默认的滚动求和(结果在窗口末尾) df['rolling_sum_end'] = df['value'].rolling(window=window_size).sum() # 第二步:将结果移位到窗口起始位置,移位步长为 -(window_size - 1) df['rolling_sum_start'] = df['rolling_sum_end'].shift(-(window_size - 1))
最终输出的rolling_sum_start列就是你要的结果:
- 索引0(窗口起始位置)对应
1+2+3+4=10 - 索引1对应
2+3+4+5=14 - 以此类推,最后3行是NaN(因为没有足够的后续数据形成完整窗口)
方案2:反向滚动 + 反转数据(适合特殊场景)
如果你不想先计算末尾的结果,也可以通过反转数据的方式实现:
# 反转数据后计算滚动求和,再反转回来 df['rolling_sum_start'] = df['value'][::-1].rolling(window=window_size).sum()[::-1]
这个方法的逻辑是:把数据倒过来后,原来的窗口起始位置就变成了新数据的窗口末尾,计算完滚动求和再反转回去,结果就自动对应到原数据的窗口起始位置了。效果和方案1完全一致,只是实现思路不同。
两种方法都是基于Pandas的向量式操作,比手写循环高效太多,尤其是处理大数据量的时候优势明显。
内容的提问来源于stack exchange,提问作者dudeguy
相关产品推荐
相关产品推荐

