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
相关产品推荐
相关产品推荐

