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

如何让包含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:24:32