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

Pandas如何实现剔除窗口最值的rolling滚动平均计算

实现滚动窗口剔除最值后求均值的方案

需求说明

  • 初始实现为对DataFrame的ANGLE列做窗口大小30的滚动平均,代码为tad3["angl_avg"]=tad3['ANGLE'].rolling(30).mean()
  • 需调整逻辑:每个滚动窗口计算均值前,先剔除窗口内的最大值、最小值,再对剩余值求平均。pandas原生rolling.mean()没有提供对应内置参数,可通过rolling.apply()传入自定义计算函数实现。

基础实现代码

import numpy as np

def cut_extreme_mean(window):
    # 窗口长度不足30时返回空值,和原生rolling计算逻辑保持一致
    if len(window) < 30:
        return np.nan
    # 各剔除1个最大值、1个最小值后计算均值
    return (window.sum() - window.max() - window.min()) / (len(window) - 2)

# raw=True表示传入numpy数组而非pandas Series,大幅提升计算速度
tad3["angl_avg"] = tad3["ANGLE"].rolling(30).apply(cut_extreme_mean, raw=True)

特殊场景适配

如果你的需求是剔除窗口内所有等于最大值、最小值的数值(而非仅剔除1个最大、1个最小值),可以替换计算函数为以下版本:

def cut_all_extreme_mean(window):
    if len(window) < 30:
        return np.nan
    win_max, win_min = window.max(), window.min()
    filtered_vals = window[(window != win_max) & (window != win_min)]
    # 兼容极端场景:窗口内所有值完全相同,过滤后无剩余值,直接返回原数值
    return filtered_vals.mean() if len(filtered_vals) > 0 else win_max

性能提示:如果数据量超过10万行,建议优先使用带raw=True的numpy计算逻辑,比传入Series做计算快3~5倍。

内容的提问来源于stack exchange,提问作者Cher K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:06:26