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

如何在Pandas比较操作中传递numpy.nan值

问题:布尔条件中保留NaN值的传递需求

现有代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 3, np.nan]})
df['B'] = df['A'] > 2

期望结果:

A      B
0  1.0  False
1  3.0   True
2  NaN    NaN

实际结果:

A      B
0  1.0  False
1  3.0   True
2  NaN  False

需要实现布尔条件判断时保留NaN值的传递,且尽量避免使用lambda、.map、.apply或np.where语句。此外,尝试过将NaN替换为pd.NA并改用Nullable数据类型(如Int64/Float64),虽能得到期望结果,但与statsmodels等第三方包存在兼容性问题(触发已知TypeError),若有让pd.NA兼容标准float/int类型的方法也可采用。


解决方案

方法1:使用Series.where直接保留NaN

利用pd.Series.where方法,在原条件的基础上,仅当原列非NaN时保留条件结果,否则设为np.nan,完全符合需求且无需禁用的方法:

df['B'] = (df['A'] > 2).where(df['A'].notna(), np.nan)

执行后即可得到期望结果,且B列的数据类型为float(NaN为np.nan),能兼容statsmodels等包。

方法2:封装函数批量处理

如果代码中有大量此类条件表达式,可以封装极简函数复用逻辑,避免重复编写判断:

def preserve_nan(condition_result):
    return condition_result.where(condition_result.notna(), np.nan)

# 调用示例
df['B'] = preserve_nan(df['A'] > 2)
df['C'] = preserve_nan(df['A'] < 1)  # 其他条件同样适用

方法3:Nullable类型转普通类型兼容第三方包

若想使用pd.NA的特性,可先将列转为Nullable类型完成判断,再转回普通float类型(pd.NA会自动转为np.nan),既保留判断逻辑,又能兼容statsmodels:

# 转为Nullable Float64类型执行判断
temp_col = df['A'].astype('Float64')
# 转回普通float类型,pd.NA转为np.nan
df['B'] = (temp_col > 2).astype('float')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:07:14