Pandas 计算指定分组过去3天滚动平均值的实现方案
Pandas 多分组维度下3天滚动平均值实现
核心实现逻辑
实现该需求的核心逻辑分为3步:
- 预处理阶段将日期列转换为标准时间格式,按「分组维度+时间」排序,确保每个独立分组内的时间序列有序,避免滚动窗口取值错乱
- 按需要独立计算的维度(本题为
category、sub-category)做分组隔离,禁止跨组混算滚动值 - 配置符合要求的滚动窗口参数:设置窗口长度为3,最小有效观测数为3,即不足3条数据时返回空值,匹配预期输出规则
可运行代码
import pandas as pd # 读取原始结构化数据 df = pd.read_csv("your_source_data.csv") # 转换日期列为pandas可识别的时间类型 df["day"] = pd.to_datetime(df["day"]) # 按分组维度+日期升序排序,重置索引 df = df.sort_values(by=["category", "sub-category", "day"]).reset_index(drop=True) # 分组计算过去3天滚动平均值 df["rolling_average_past_3_days"] = ( df.groupby(["category", "sub-category"])["count"] .transform( lambda series: series.rolling(window=3, min_periods=3).mean().round(1) ) )
参数说明
window=3:滚动窗口覆盖同组内最近3条按时间排序的记录min_periods=3:窗口内有效记录数小于3时,计算结果返回空值,对应输出中每组前2条记录的滚动值为空的规则transform方法会将计算得到的滚动值直接对齐回原表的对应行,无需额外做表连接操作
结果校验
按照上述代码计算的结果与预期输出完全匹配:
- electronic/phone 子类2021-01-03的滚动值为(10+12+3)/3≈8.3
- electronic/phone 子类2021-01-04的滚动值为(12+3+20)/3≈11.6
- electronic/computer 子类2021-01-03的滚动值为(15+12+20)/3≈15.7
内容的提问来源于stack exchange,提问作者Kevin Nash
相关产品推荐
相关产品推荐

