You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现Window function:当前行至无界后续行的分组滚动求和

Python实现分组后从当前行到末尾的累计求和

核心思路

要实现按分类列分组、日期排序后,计算当前行至后续所有行的数值求和,可利用序列反转+累计求和的技巧,结合pandas的groupby和transform方法完成,这是最Pythonic的方案之一。

步骤与代码实现

  1. 预处理数据:确保日期列是datetime类型,避免排序错误,并按分组列和日期列排序。
  2. 反向累计求和:对每个分组的数值列进行反转,执行累计求和后再反转回来,得到从当前行到末尾的总和。
import pandas as pd

# 构造示例数据
data = {
    'Date(MM/DD/YYYY)': ['10/01/2016', '11/01/2016', '12/01/2016', '01/01/2017', '02/01/2017', '03/01/2017', 
                         '04/01/2017', '05/01/2017', '06/01/2017', '07/01/2017', '08/01/2017', '09/01/2017'],
    'ID': [1]*12,
    'Amt': [10,5,20,50,60,20,0,0,38,60,50,20]
}
df = pd.DataFrame(data)

# 转换日期格式并排序
df['Date(MM/DD/YYYY)'] = pd.to_datetime(df['Date(MM/DD/YYYY)'], format='%m/%d/%Y')
df = df.sort_values(['ID', 'Date(MM/DD/YYYY)']).reset_index(drop=True)

# 计算目标列:当前行至后续所有行的求和
df['Desired Column'] = df.groupby('ID')['Amt'].transform(lambda x: x[::-1].cumsum()[::-1])

# 输出结果
print(df)

代码解释

  • x[::-1]:将分组后的Amt序列反转,把末尾元素移到开头;
  • cumsum():对反转后的序列做累计求和,此时得到的是从原序列末尾开始向前的累计值;
  • [::-1]:再次反转序列,将结果还原为原顺序,此时每个位置的值就是原序列当前行到末尾的总和。

替代方案(等效但效率稍低)

也可以用expanding窗口实现,逻辑和上述方法一致:

df['Desired Column'] = df.groupby('ID')['Amt'].transform(lambda x: x[::-1].expanding().sum()[::-1])

内容的提问来源于stack exchange,提问作者Sassy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:35:34