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

