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

Python3.6中用Pandas移除含NaN/Inf的行时遇错误,求代码修正

解决scikit-learn中的NaN/Inf错误及后续AttributeError问题

我来帮你一步步搞定这两个问题:

第一个错误的根源

你碰到的ValueError: Input contains NaN, infinity or a value too large for dtype('float64'),本质是scikit-learn的所有模型都没法处理缺失值(NaN)或无穷大(Inf),必须先把这些脏数据清理干净才能训练模型。

为什么会出现AttributeError: 'NoneType' object has no attribute 'dropna'?

你的链式调用代码报错,大概率是不小心在replace里加了inplace=True参数——用inplace=True时,replace会直接修改原DataFrame,并且返回None,这时再链式调用dropna自然会报错,因为None根本没有这个方法。

另外,你原来的代码用了axis=1,这是删除包含NaN/Inf的列,但你的需求是删除行,所以应该改成axis=0。

修正后的代码

方法1:链式调用(推荐,不修改原DataFrame)

import numpy as np
# 生成清理后的新DataFrame,删除包含NaN/Inf的行
cleaned_df = df.replace([np.inf, -np.inf], np.nan).dropna(axis=0)

这里replace会返回一个替换后的新DataFrame,接着调用dropna(axis=0)删掉所有带缺失值的行,最后把结果存到新变量里,原df不会被改动。

方法2:原地修改原DataFrame

如果你想直接修改原df,可以分开写(别用链式调用):

import numpy as np
# 先把Inf替换成NaN
df.replace([np.inf, -np.inf], np.nan, inplace=True)
# 再删除包含NaN的行
df.dropna(axis=0, inplace=True)

额外小技巧:提前排查问题数据

清理前可以先检查哪些列藏着NaN或Inf,方便定位问题:

import numpy as np
# 查看每一列是否存在NaN/Inf
print(df.isin([np.nan, np.inf, -np.inf]).any())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:25:37