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

如何将DataFrame中超出上下限值的数值替换为np.nan(异常值处理)

如何将DataFrame指定列中超出行上下限的值替换为np.nan?

问题描述

现有包含A、B、C、D列的DataFrame,同时每行对应有lower(下限)和upper(上限)列,需要用最简洁的方法把A、B、C、D列中超出对应行上下限的数值替换为np.nan。

示例数据生成代码:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randint(50,300,size=(100, 4)), columns=list('ABCD')) # 生成随机DataFrame
df2 = pd.DataFrame(np.random.randint(150,180,size=(100, 1)), columns=['lower'])
df3 = pd.DataFrame(np.random.randint(180,200,size=(100, 1)), columns=['upper'])
df = pd.concat([df1,df2,df3], axis=1)

简洁解决方案

直接利用pandas的广播特性和where()方法,一行代码即可完成需求:

df[['A', 'B', 'C', 'D']] = df[['A', 'B', 'C', 'D']].where(
    (df[['A', 'B', 'C', 'D']] >= df['lower']) & (df[['A', 'B', 'C', 'D']] <= df['upper'])
)

方法说明

  • df[['A','B','C','D']] >= df['lower']:借助广播机制,让每行的lower值与该行A-D列的所有值逐一比较,得到布尔矩阵
  • 同理,df[['A','B','C','D']] <= df['upper']得到上限比较的布尔矩阵
  • 用&合并两个布尔矩阵,标记出所有符合lower ≤ 数值 ≤ upper的位置
  • where()方法会保留标记为True的原始值,将False对应的位置替换为np.nan

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:54:29