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

Pandas误将浮点数值识别为NaN,类型转换报错求助

解决Pandas浮点转整数时的非有限值错误

我来帮你拆解这个问题:你遇到的ValueError: Cannot convert non-finite values (NA or inf) to integer,说明你的列里确实存在NaN或者无穷大(inf/-inf),但你排查时没找到,大概率是排查方式的问题,或者查看行时没盯对目标列。

为什么isnull()返回True但你看不到NaN?

首先,isnull()只会识别NaN和None,但错误提示里还提到了inf——无穷大值不会被isnull()检测到,但同样会导致astype(int)失败。另外,你用zbill.iloc[missing_values_list]查看行时,可能不小心看了其他列的数值,而非ACTIVITY START MONTH列本身,或者Pandas的显示设置让NaN没明显显示出来。

正确的排查步骤

先精准定位所有非有限值(包括NaN和inf):

import numpy as np

# 统计NaN的数量
print(f"NaN数量: {zbill['ACTIVITY START MONTH'].isna().sum()}")
# 统计inf/-inf的数量
print(f"无穷大值数量: {zbill['ACTIVITY START MONTH'].isin([np.inf, -np.inf]).sum()}")

# 直接筛选出所有非有限值的行,只显示目标列避免看错
non_finite_rows = zbill[~zbill['ACTIVITY START MONTH'].apply(np.isfinite)]
print(non_finite_rows[['ACTIVITY START MONTH']])

这样你就能明确看到到底是NaN还是inf在搞鬼。

解决方案

根据你找到的问题类型,选择对应的处理方式:

1. 如果是NaN

  • 填充后转整数(比如用列的中位数/众数,或者固定值):
# 用中位数填充NaN
median_val = zbill['ACTIVITY START MONTH'].median()
zbill['ACTIVITY START MONTH'] = zbill['ACTIVITY START MONTH'].fillna(median_val).astype(int)
  • 或者直接删除含NaN的行:
zbill = zbill.dropna(subset=['ACTIVITY START MONTH'])
zbill['ACTIVITY START MONTH'] = zbill['ACTIVITY START MONTH'].astype(int)

2. 如果是inf/-inf

替换成合理的数值(比如列的最大有限值):

# 先把inf转成NaN,再取最大有限值
max_valid = zbill['ACTIVITY START MONTH'].replace([np.inf, -np.inf], np.nan).max()
zbill['ACTIVITY START MONTH'] = zbill['ACTIVITY START MONTH'].replace([np.inf, -np.inf], max_valid).astype(int)

3. 保留缺失值的整数类型

如果你不想删除或填充,Pandas支持Nullable Integer类型(Int64,注意大写I),可以容纳缺失值:

zbill['ACTIVITY START MONTH'] = zbill['ACTIVITY START MONTH'].astype('Int64')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:52:32