如何让包含NaN的NumPy比较操作返回NaN而非False?
如何让包含NaN的NumPy比较操作返回NaN而非False?
我完全懂你遇到的这个痛点——用普通的==比较包含NaN的Series时,只要涉及NaN的比较都会返回False,但这显然不符合你的预期,你希望这些涉及空值的位置直接返回NaN对吧?
这里有几个简单直接的方法可以实现你的需求:
方法一:用np.where结合空值判断
我们可以先标记出所有包含NaN的行,再用np.where把这些行的比较结果替换成NaN,其他行保留正常的相等判断结果:
import numpy as np import pandas as pd df = pd.DataFrame({'a': [np.NaN, np.NaN, 1], 'b': [np.NaN, 1, 1]}) # 生成空值掩码:只要a或b是NaN,就标记为True nan_mask = df['a'].isna() | df['b'].isna() # 用np.where实现条件替换 result = np.where(nan_mask, np.nan, df['a'] == df['b']) print(result)
运行结果和你想要的布尔型带NaN的形式一致:
[nan nan True]
如果你想要数字类型的1/NaN结果,只需要把结果转成float类型即可:
result = np.where(nan_mask, np.nan, df['a'] == df['b']).astype(float) print(result)
输出:
[nan nan 1.]
方法二:先做比较再替换空值位置
也可以先执行普通的相等比较,再把包含NaN的行的结果覆盖成NaN:
# 先执行普通的相等比较 eq_result = df['a'] == df['b'] # 把空值掩码对应的位置设为NaN eq_result.loc[nan_mask] = np.nan print(eq_result)
输出结果:
0 NaN 1 NaN 2 True dtype: object
这里结果的dtype是object,因为普通的bool类型无法同时容纳布尔值和NaN;如果需要pandas专用的支持NaN的布尔类型,可以用astype('boolean')转换:
eq_result = eq_result.astype('boolean') print(eq_result)
输出:
0 <NA> 1 <NA> 2 True dtype: boolean
备注:内容来源于stack exchange,提问作者Faraz Masroor
相关产品推荐
相关产品推荐

