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

