如何使用Scikit-Learn的SimpleImputer填补DataFrame指定列缺失值
问题代码错误点及修正方案
- 错误1:多列选取语法错误
pandas选取多列需要传入由列名组成的列表,正确写法是df[["a", "b", "e"]],原代码df["a", "b", "e"]会被识别为传入单个元组作为列名,触发KeyError。 - 错误2:缺失值标识配置错误
pandas读取数据后默认缺失值为np.nan(浮点数类型的空值),不是字符串'NaN',原代码missing_values='NaN'无法识别实际的空值,需要改为missing_values=np.nan,或者直接省略该参数(SimpleImputer默认值就是np.nan)。如果读取数据时没有自动把字符串'NA'转为空值,可以在pd.read_csv时添加na_values='NA'参数,或者将missing_values参数设置为'NA'。 - 错误3:已废弃参数使用错误
scikit-learn v0.22版本之后,SimpleImputer已经移除axis参数,默认自动按列计算统计值填补,保留axis=0会触发警告甚至报错,直接删除该参数即可。 - 错误4:拟合与转换的数据维度不匹配
fit阶段只用了a/b/e三列数据训练填补器,transform阶段却传入完整DataFrame的所有列(包含c/d两个非数值列,且列数和拟合阶段不一致),会触发维度不匹配错误,transform阶段也需要传入对应三列数据。
修正后的完整代码
import pandas as pd import numpy as np from sklearn.impute import SimpleImputer # 此处为样例数据生成代码,你实际使用时替换为自己的df读取逻辑即可 df = pd.DataFrame({ 'a': [np.nan,5,7,np.nan,4], 'b': [39,np.nan,53,np.nan,24], 'c': ['cat','dog','cat','cat','dog'], 'd': ['gray','brown','tan','black','tan'], 'e': [20,np.nan,33,41,np.nan] }) # 初始化均值填补器 miss_mean_imputer = SimpleImputer(strategy='mean') # 仅对需要填补的三列执行拟合+转换 imputed_cols = miss_mean_imputer.fit_transform(df[["a", "b", "e"]]) # 将填补后的数值赋值回原DataFrame对应列,保留其他原列数据 df[["a", "b", "e"]] = imputed_cols print(df)
内容的提问来源于stack exchange,提问作者user15697038
相关产品推荐
相关产品推荐

