如何用Pandas原生方法实现按用户分组的前10天Total值条件聚合
Pandas 分组滚动近10天求和优化方案
核心思路
直接使用Pandas原生支持的时间滚动窗口实现,完全替代嵌套循环,底层为C实现的向量化运算,性能比嵌套循环提升几十到上百倍,完全符合Pandas开发规范。
前置处理
首先需要保证日期列是datetime类型,且每个用户的数据按日期排序:
import pandas as pd # 转换Date列为datetime格式,是时间窗口计算的必要前提 df['Date'] = pd.to_datetime(df['Date']) # 按用户ID+日期排序,保证时间序列顺序正确 df = df.sort_values(by=['UserID', 'Date']).reset_index(drop=True)
核心实现代码
# 按UserID分组,使用10天滚动窗口求和,和原有循环逻辑完全匹配 df['TotalPrev10Days'] = df.groupby('UserID', group_keys=False).apply( lambda group: group.set_index('Date')['Total'] .rolling(window='10D', closed='left') .sum() .reset_index(drop=True) )
参数说明
window='10D':指定滚动窗口长度为10天,而非固定行数,完美适配日期不连续的业务场景closed='left':窗口采用左闭右开规则,即包含当前日期-10天的记录,不包含当前行日期的记录,和你原有循环的筛选逻辑完全一致- 最终输出结果和你原有循环输出的结果完全匹配,无需额外调整业务逻辑
性能对比
原有嵌套循环的时间复杂度为O(n²),万行以上数据就会出现明显卡顿;而原生滚动窗口的时间复杂度接近线性,百万行级数据也可以在秒级完成计算。
内容的提问来源于stack exchange,提问作者Taher Elhouderi
相关产品推荐
相关产品推荐

