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

Pandas中0除以0时isna/isnull无法识别NaN的问题咨询

Pandas可空数值类型计算列的.isna()/.isnull()异常问题

问题重现

先创建包含可空值的DataFrame并转换类型:

import pandas as pd
import numpy as np

df_challenge = pd.DataFrame({'x': [1, pd.NA, 6, 9, pd.NA, 0, 9, 10, 0, 9, pd.NA, 0],
                             'y': [0, 7.2, pd.NA, 10, 0, 1, 9.2, 10.65, pd.NA, 9, pd.NA, 0],
                             'y_copy': [0, 7.2, np.nan, 10, 0, 1, 9.2, 10.65, np.nan, 9, np.nan,0]})

df_challenge = df_challenge.convert_dtypes()

强制转换某列类型:

df_challenge.y_copy = df_challenge.y_copy.astype('float')

创建两个计算列:

df_challenge = df_challenge.assign(z = df_challenge.x/df_challenge.y)
df_challenge = df_challenge.assign(z1 = df_challenge.x.astype('float')/df_challenge.y_copy)

异常现象

调用.isna()/.isnull()统计缺失值时,z列结果不符合预期:

df_challenge.z.isna().sum() # 返回5,实际应为6
df_challenge.z.isnull().sum() # 返回5

df_challenge.z1.isna().sum() # 返回6,结果正确
df_challenge.z1.isnull().sum() # 返回6

疑问与临时方案

  • 为何z列的.isna()/.isnull()结果异常?z列基于Pandas新可空类型(Int64/Float64)计算,z1列基于普通float类型计算。
  • 使用np.isfinite作为临时方案能识别z列的所有无效值,代码如下,该方案是否合理?有没有更优解?
df_challenge.loc[~df_challenge.z.pipe(np.isfinite),:]

原因分析

核心差异在于Pandas可空浮点类型(Float64)与普通float类型对**无穷大值(inf)**的处理逻辑:

  • z列的类型是Float64(可空浮点类型),该类型将inf(由非零数除以0得到)视为合法有效值,不会被.isna()/.isnull()判定为缺失值。而z列中恰好存在1个inf值(对应x=1、y=0的行),导致统计结果少1个,显示为5。
  • z1列是普通float类型,计算中0/0得到的是NaN,且.isna()会识别此类NaN;同时x/y的缺失值传递也会生成NaN,最终统计到6个无效值,结果正确。

方案评估与优化

临时方案合理性

使用np.isfinite是合理的:该函数会同时排除inf、-inf和NaN/pd.NA,能完整识别所有计算产生的无效值,满足需求。

更优解决方案

  1. 转换为普通float类型:将z列转为普通float后,.isna()可识别所有无效值:
df_challenge['z'] = df_challenge['z'].astype('float')
print(df_challenge.z.isna().sum()) # 输出6
  1. 组合判断无效值:用.isna()结合.isinf()直接覆盖缺失值和无穷大值:
invalid_mask = df_challenge.z.isna() | df_challenge.z.isinf()
print(invalid_mask.sum()) # 输出6
# 筛选无效行
df_challenge.loc[invalid_mask, :]
  1. 创建列时指定类型:计算时直接将可空类型转为普通float,从根源避免差异:
df_challenge = df_challenge.assign(z = df_challenge.x.astype('float')/df_challenge.y.astype('float'))
print(df_challenge.z.isna().sum()) # 输出6

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:23:08