当前位置:首页>python>Python(Pandas分组滚动窗口实战):分组内独立滚动统计实现方案

Python(Pandas分组滚动窗口实战):分组内独立滚动统计实现方案

  • 2026-10-11 06:12:36
Python(Pandas分组滚动窗口实战):分组内独立滚动统计实现方案
业务中经常需要按用户、按门店分组,在每组内部做滑动窗口统计,例如每个用户最近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)

核心总结

  1. rolling本身不会识别分组,必须在groupby内部执行滚动运算;
  2. group_keys=False避免索引产生多层嵌套;
  3. 大数据量下apply性能较差,优先使用transform版本;
  4. 窗口可以设置时间窗口window="3D",配合时间索引做时间维度滚动统计。

最新文章

随机文章