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

Pandas中Float64与float64运算生成的NaN无法识别的原因及解决

问题:Pandas中Float64与float64类型NaN运算后isna()识别异常

当非NaN的Float64类型与NaN的float64类型进行算术运算时,Pandas无法通过isna()识别运算结果中的NaN,示例代码如下:

import pandas as pd
import numpy as np

print(f'{pd.__version__=}')
# pd.__version__='1.5.1'
print(f'{np.__version__=}')
# np.__version__='1.23.4'

df = pd.DataFrame({'NonNaN-Float64': [1], 'NaN-float64': [np.NaN], 'NaN-Float64': [np.NaN]})
df = df.astype({'NonNaN-Float64': 'Float64', 'NaN-float64': 'float64', 'NaN-Float64': 'Float64'})
df['res'] = df['NonNaN-Float64'] * df['NaN-float64']

print(df)
#    NonNaN-Float64  NaN-float64  NaN-Float64  res
# 0             1.0          NaN         <NA>  NaN

print(df.dtypes)
# NonNaN-Float64    Float64
# NaN-float64       float64
# NaN-Float64       Float64
# res               Float64
# dtype: object

print(df.isna())
#    NonNaN-Float64  NaN-float64  NaN-Float64    res
# 0           False         True         True  False

上述示例中,res列实际为NaN,但df.isna()结果显示其不为缺失值(False),不符合预期。


原因分析

这是因为Pandas的Nullable Float64类型(大写F开头)与NumPy原生float64类型在NaN处理上存在兼容差异:

  • Float64类型使用Pandas自身的<NA>标记表示缺失值,而float64类型使用NumPy的np.nan。
  • 当两种类型进行算术运算时,结果会被强制转换为Float64类型,但运算生成的是NumPy的np.nan,而非Float64对应的<NA>。
  • Pandas的isna()方法对Nullable类型仅识别<NA>,不会将NumPy的np.nan判定为缺失值,因此出现结果矛盾。

解决方法(除统一所有数据类型外)

  • 显式转换结果中的NumPy NaN为Pandas <NA>:
    直接替换运算结果中的np.nan,或者用pd.to_numeric强制转换:

    # 方法1:直接替换
    df['res'] = df['res'].replace(np.nan, pd.NA)
    # 方法2:用to_numeric转换
    df['res'] = pd.to_numeric(df['res'], errors='coerce')
    
  • 提前处理float64列的NaN:
    在运算前将float64列的np.nan替换为pd.NA,确保运算双方都是Float64类型的缺失值标记:

    df['NaN-float64'] = df['NaN-float64'].replace(np.nan, pd.NA)
    df['res'] = df['NonNaN-Float64'] * df['NaN-float64']
    
  • 自定义缺失值判断逻辑:
    结合pd.isna()和np.isnan()做完整判断,适合小数据集场景:

    df['res_isna'] = df['res'].apply(lambda x: pd.isna(x) or np.isnan(x))
    

内容的提问来源于stack exchange,提问作者Valery Kustov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:25:37