Pandas如何一步实现滚动均值后分组求和 避免生成冗余中间列
需求说明
- 实现滚动均值计算 → 按Month字段分组求和的计算流程
- 不在df2中创建额外的中间计算列,避免遍历窗口值生成滚动均值时产生大量冗余列占用内存
- 适配双窗口组计算场景:分别遍历df1中
Mean-1 input Value、Mean-2 input Value字段的窗口值计算对应滚动均值,最终输出按Month分组求和的结果 - 原有单窗口、双窗口实现都会先把所有滚动均值结果作为新列写入df2,冗余数据多,内存开销大。
无冗余列实现方案
核心逻辑:不把滚动均值结果写入df2,计算完单个窗口的滚动均值后直接做分组求和,仅保留最终需要的聚合结果,所有临时计算值用完即释放。
import pandas as pd # 读取两组窗口参数,去重避免重复计算 win_group1 = df1['Mean-1 input Value'].unique() win_group2 = df1['Mean-2 input Value'].unique() result_list = [] # 计算第一组窗口的结果 for window in win_group1: # 临时计算滚动均值,不写入df2 rolling_val = df2['Number'].rolling(window=window).mean() # 直接按Month分组求和,重命名列后加入结果集 agg_val = rolling_val.groupby(df2['Month']).sum().rename(f"Mean-1 {window}") result_list.append(agg_val) # 计算第二组窗口的结果 for window in win_group2: rolling_val = df2['Number'].rolling(window=window).mean() agg_val = rolling_val.groupby(df2['Month']).sum().rename(f"Mean-2 {window}") result_list.append(agg_val) # 拼接所有窗口的聚合结果,得到最终输出 df3 = pd.concat(result_list, axis=1)
方案说明
- 全程不会修改原df2的结构,不会生成任何冗余的中间列,内存占用远低于原有写法
- 列名增加
Mean-1/Mean-2前缀,用于区分两组窗口来源,避免两个字段存在相同窗口值时出现列名覆盖问题。如果不需要区分来源,直接把列名改回f"Mean {window}"即可,注意提前排查重复窗口值避免列冲突。 - 对窗口值做了去重处理,如果df1的窗口输入列存在重复值,不会做重复计算,运行效率更高。
如果需要更精简的代码,可以直接用列表推导式写成单流程版本:
df3 = pd.concat( [ *[df2['Number'].rolling(w).mean().groupby(df2['Month']).sum().rename(f"Mean-1 {w}") for w in df1['Mean-1 input Value'].unique()], *[df2['Number'].rolling(w).mean().groupby(df2['Month']).sum().rename(f"Mean-2 {w}") for w in df1['Mean-2 input Value'].unique()] ], axis=1 )
内容的提问来源于stack exchange,提问作者H.K.
相关产品推荐
相关产品推荐

