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

如何按列将Pandas DataFrame中的异常值替换为np.nan?

问题原因及解决方法
  • 核心问题:你用了df_ex.apply(outliers, axis=1),其中axis=1是按行处理每个数据行,而你需要的是按列计算列内的异常值,方向完全搞反了。
  • 为什么结果不对:axis=1时,outliers函数会接收每一行作为独立的Series,计算该行的分位数和IQR,判断该行内的异常值——这和你要的“按列统计整列数据的异常值”逻辑完全不符。

修正后的代码

把axis=1改成axis=0(或者直接省略,因为apply默认axis=0就是按列处理):

import pandas as pd
import numpy as np

df_ex = pd.DataFrame({
'a': [np.nan,np.nan,2.0,-0.5,6,120], 
'b': [1, 3, 4, 2,40,11], 
'c': [np.nan, 2, 3, 4,2,2], 
'd': [6, 2.2, np.nan, 0,3,3],
'e': [12, 4, np.nan, -5,5,5],
'f': [2, 3, 8, 2,12,8],
'g': [3, 3, 9.0, 11, np.nan,2]})

def outliers(s, replace=np.nan):
    # 计算分位数时跳过NaN,避免干扰统计结果
    Q1, Q3 = np.percentile(s.dropna(), [25 ,75])
    IQR = Q3 - Q1
    return s.where((s >= (Q1 - 1.5 * IQR)) & (s <= (Q3 + 1.5 * IQR)), replace)

# 按列处理异常值,axis=0可省略
df_ex_o = df_ex.apply(outliers, axis=0)
print(df_ex_o)

处理效果说明

修正后会按列统计异常值:

  • 列a中的120会被替换为NaN(属于列内极端值)
  • 列b中的40会被替换为NaN(属于列内极端值)
  • 原DataFrame中的NaN会保留,其他正常数据不受影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:55:25