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

