使用sklearn SimpleImputer后仍存在缺失值的问题排查
问题分析与修正
你的代码出现残留NaN的核心原因是赋值时的索引不匹配,另外代码写法也可以简化优化,具体问题和解决方法如下:
问题点拆解
- 索引不匹配:你将
fit_transform的结果转为DataFrame后赋值给原列,新生成的DataFrame使用默认的连续整数索引。如果原imputed_X_temp的索引不是连续整数(比如存在非整数索引、缺失的整数索引),就会导致部分行无法匹配,保留原始NaN。 - 冗余的数组转换:使用
Series.array.reshape(-1,1)的写法既繁琐,又容易引入数据结构的潜在问题,不如直接传入DataFrame列更稳妥。
修正后的代码
from sklearn.impute import SimpleImputer import pandas as pd imputer_const = SimpleImputer(strategy="constant", fill_value="US") imputed_X_temp = X_temp.copy() # 直接传入列的DataFrame形式,转换后用ravel()转为一维数组赋值,保证索引完全匹配 imputed_X_temp["countryCode"] = imputer_const.fit_transform(imputed_X_temp[["countryCode"]]).ravel()
额外检查项
如果修正后仍有NaN,建议排查:
- 原数据中是否存在非NaN的缺失值(比如空字符串、空格、
None等),可以用imputed_X_temp["countryCode"].replace(["", " "], pd.NA, inplace=True)先统一转为NaN再处理。 - 确认
countryCode列的数据类型是否为字符串,混合类型可能导致SimpleImputer无法正确识别缺失值。
内容的提问来源于stack exchange,提问作者Kamil
相关产品推荐
相关产品推荐

