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

