业务中经常需要按用户、按门店分组,在每组内部做滑动窗口统计,例如每个用户最近7天消费总额。直接使用rolling会跨组计算造成数据污染,本篇讲解分组+滚动窗口正确写法,解决分组边界数据串扰问题。场景:用户消费记录表,字段:user_id(用户ID)、dt(消费日期)、amount(消费金额)。需要计算每个用户每条记录对应的近3条消费滚动总金额,不同用户之间不能互相参与窗口计算。生成测试数据
import pandas as pdimport numpy as npnp.random.seed(42)data = { "user_id": [1,1,1,1,2,2,2,2], "dt": pd.date_range("2026-07-01", periods=8, freq="D"), "amount": np.random.randint(10,100,size=8)}df = pd.DataFrame(data)print(df)
错误写法:rolling不做组隔离,跨用户计算
# 错误:会把user_id=1和user_id=2的数据混进窗口df["roll_sum_wrong"] = df["amount"].rolling(window=3).sum()
正确写法:groupby.apply 组内独立滚动
def group_roll(sub_df): sub_df["roll_sum"] = sub_df["amount"].rolling(window=3).sum() return sub_dfdf_result = df.groupby("user_id", group_keys=False).apply(group_roll)print(df_result)
核心总结
- rolling本身不会识别分组,必须在groupby内部执行滚动运算;
- group_keys=False避免索引产生多层嵌套;
- 大数据量下apply性能较差,优先使用
transform版本; - 窗口可以设置时间窗口
window="3D",配合时间索引做时间维度滚动统计。