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

Pandas如何将超出列均值±3倍标准差范围的元素替换为np.nan

按列3σ阈值替换异常值为NaN的实现

直接利用pandas的对齐广播机制即可,无需逐列循环,支持原地修改,适配任意列数的DataFrame。

核心实现代码

import numpy as np

# 按列计算统计阈值
col_means = df.mean()
col_stds = df.std(ddof=1)  # 默认ddof=1为样本标准差,需总体标准差则设ddof=0
lower = col_means - 3 * col_stds
upper = col_means + 3 * col_stds

# 原地替换超出范围的值为np.nan
df.mask(
    cond=(df < lower) | (df > upper),
    other=np.nan,
    inplace=True
)

之前用where方法未成功的原因

where和mask的判断逻辑完全相反:

  • mask:满足cond条件的位置,替换为other值
  • where:不满足cond条件的位置,替换为other值

如果要用where实现相同效果,写法如下:

df.where(
    cond=(df >= lower) & (df <= upper),
    other=np.nan,
    inplace=True
)

说明

  • 计算得到的lower、upper是和df列索引一一对应的Series,和DataFrame做比较时pandas会自动把每列的阈值广播到整列所有行,天然适配“每列用自身均值、标准差计算阈值”的需求,不管是1列还是11列都可以直接运行,不需要额外调整。
  • 不需要写逐列的apply/lambda函数,向量化运算的效率远高于逐元素/逐列循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:46:01