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

