如何在Pandas中实现基于日期的向前滚动求和?
实现向前滚动求和的解决方案
我明白你的需求啦!你现在用groupby+rolling得到的是向后滚动求和(从当前行往过去方向取7天的累计和),但你想要的是向前滚动求和(从当前行往未来方向取7天的累计和)对吧?
其实解决思路很简单:我们可以把每个分组的数据反转顺序,用你已经熟悉的滚动求和逻辑处理,最后再把结果反转回来,就等价于实现了向前滚动的效果。
具体代码实现
先把你的完整代码和解决方案整合在一起:
import pandas as pd import numpy as np # 生成原始DataFrame dates = pd.date_range(start='2016-01-01', periods=20, freq='d') df = pd.DataFrame({'A': [1] * 20 + [2] * 12 + [3] * 8, 'B': np.concatenate((dates, dates)), 'C': np.arange(40)}) # 按日期排序(你已经完成的步骤) df.sort_values('B', inplace=True) df.reset_index(drop=True, inplace=True) # 重置索引让后续操作更顺畅 # 核心:实现向前滚动求和 forward_rolling_sum = df.groupby('A').apply( lambda group: group['C'][::-1].rolling(7, min_periods=0).sum()[::-1] ).reset_index(level=0, drop=True) # 将结果合并到原DataFrame中 df['forward_rolling_C_sum'] = forward_rolling_sum
代码解释
group['C'][::-1]:把每个分组的C列数据反转顺序,这样原来的“未来行”就变成了“过去行”rolling(7, min_periods=0).sum():对反转后的数据执行你已经熟悉的滚动求和,此时计算的就是原数据中当前行及未来6天的和[::-1]:把求和结果再次反转,恢复原数据的顺序reset_index(level=0, drop=True):移除groupby带来的额外索引层,让结果能和原DataFrame完美匹配
验证结果
比如看A=1的部分数据,向前滚动求和的结果会是:
| A | B | C | forward_rolling_C_sum |
|---|---|---|---|
| 1 | 2016-01-01 | 0 | 0+1+2+3+4+5+6 = 21 |
| 1 | 2016-01-02 | 1 | 1+2+3+4+5+6+7 = 28 |
| 1 | 2016-01-03 | 2 | 2+3+4+5+6+7+8 = 35 |
| ... | ... | ... | ... |
这正好是你想要的向前(未来方向)滚动7天的求和结果。
内容的提问来源于stack exchange,提问作者Ahamed Moosa
相关产品推荐
相关产品推荐

