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

如何用Pandas实现窗口大小为3的混合滚动均值计算?

计算混合滚动窗口均值的实现方案

根据需求,我们需要构造大小为3的滚动窗口,每个窗口的取值规则是:取当前行的b列值,再加上前1或2行的a列值(窗口内最多包含2个历史a值),最后计算这些值的平均值。具体对应逻辑如下:

  • 第0行:仅取当前行b值,均值为10/1=10.0
  • 第1行:当前行b值 + 前1行a值,均值为(20+1)/2=10.5
  • 第2行及以后:当前行b值 + 前2行a值,均值为(b[i]+a[i-1]+a[i-2])/3

方法一:手动构造计算(高效直观)

通过shift函数获取历史a值,结合位置确定分母,直接计算:

import pandas as pd

df = pd.DataFrame.from_dict({'a':[1, 2, 3, 4, 5], 'b':[10, 20, 30, 40, 50]})

# 计算分子:当前b + 前1行a + 前2行a(缺失补0)
sum_vals = df['b'] + df['a'].shift(1).fillna(0) + df['a'].shift(2).fillna(0)
# 计算分母:第0行取1,第1行取2,第2行及以后取3
denominator = df.index.map(lambda x: min(x + 1, 3))
# 得到目标列
df['hybrid_mean_3'] = sum_vals / denominator

方法二:滚动窗口自定义函数(通用扩展性强)

利用rolling窗口结合自定义函数,适配更复杂的窗口规则:

import pandas as pd

df = pd.DataFrame.from_dict({'a':[1, 2, 3, 4, 5], 'b':[10, 20, 30, 40, 50]})

def hybrid_calc(window):
    # 取窗口最后一行的b值
    current_b = window['b'].iloc[-1]
    # 取窗口中除最后一行外的所有a值(最多2个)
    history_a = window['a'].iloc[:-1]
    # 计算均值
    return (current_b + history_a.sum()) / (1 + len(history_a))

# 设置窗口大小3,允许最小窗口为1
df['hybrid_mean_3'] = df.rolling(window=3, min_periods=1).apply(hybrid_calc, raw=False)

两种方法最终得到的hybrid_mean_3列都与示例结果一致:

a   b  hybrid_mean_3
0  1  10           10.0
1  2  20           10.5
2  3  30           11.0
3  4  40           15.0
4  5  50           19.0

内容的提问来源于stack exchange,提问作者Baron Yugovich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:25:18