You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:54:32