Python实现Window function:当前行至无界后续行的分组滚动求和
Python实现分组后从当前行到末尾的累计求和
核心思路
要实现按分类列分组、日期排序后,计算当前行至后续所有行的数值求和,可利用序列反转+累计求和的技巧,结合pandas的groupby和transform方法完成,这是最Pythonic的方案之一。
步骤与代码实现
- 预处理数据:确保日期列是datetime类型,避免排序错误,并按分组列和日期列排序。
- 反向累计求和:对每个分组的数值列进行反转,执行累计求和后再反转回来,得到从当前行到末尾的总和。
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
相关产品推荐
相关产品推荐

