如何基于两个条件替换DataFrame中的所有值
解决DataFrame多条件替换为NaN的问题
嗨,这事儿其实很简单,核心就是把多个条件用逻辑运算符组合起来就行!我给你一步步讲清楚:
首先先回顾下你原本的单一条件写法,应该是类似这样的吧?
# 单一条件:把-0.5到0.5之间的值换成NaN df = df.mask((df > -0.5) & (df < 0.5))
如果要加第二个条件,只需要用&(表示“且”,两个条件同时满足才替换)或者|(表示“或”,满足任意一个条件就替换)把条件串起来就行,注意每个条件都要用括号括起来,不然会因为运算符优先级出问题!
举两个常见场景的例子:
场景1:满足任意一个条件就替换成NaN
比如你想把「-0.5到0.5之间的值」或者「大于2的值」都换成NaN:
import pandas as pd import numpy as np # 先搞个示例DataFrame方便测试 df = pd.DataFrame({ 'col1': [-1.2, -0.3, 0.4, 1.8, 2.5], 'col2': [0.6, -0.6, 0.2, 3.1, -0.1] }) # 组合两个条件:(-0.5 < x < 0.5) 或者 (x > 2) df_updated = df.mask( ((df > -0.5) & (df < 0.5)) | (df > 2) )
运行后你会看到,-0.3、0.4、0.2、-0.1还有2.5、3.1这些值都变成NaN了。
场景2:同时满足两个条件才替换成NaN
比如你只想把「-0.5到0.5之间并且是正数」的值换成NaN:
# 组合条件:(-0.5 < x < 0.5) 并且 (x > 0) df_updated = df.mask( (df > -0.5) & (df < 0.5) & (df > 0) )
这时候只有0.4、0.2这些符合两个条件的值会被替换成NaN,负数的-0.3、-0.1会保留。
补充个小知识点:
如果你习惯用where方法的话,逻辑是反过来的——where会把不满足条件的值换成NaN,所以写法要调整一下:
# 用where实现和第一个场景一样的效果:满足条件的保留,不满足的换成NaN df_updated = df.where( ~((df > -0.5) & (df < 0.5)) & ~(df > 2) )
这里的~表示取反,意思是“既不在-0.5到0.5之间,也不大于2”的值才保留,其他换成NaN,和mask的效果一致。
内容的提问来源于stack exchange,提问作者kxp
相关产品推荐
相关产品推荐

