使用SimpleImputer按列最小值填充缺失值时报ValueError如何解决
报错原因
- 数值列定义错误:你在定义
numeric_cols时额外给X_test.select_dtypes(exclude=['object']).columns外层套了一层列表,导致numeric_cols是仅包含1个元素的列表,元素是所有数值列的Index集合。循环遍历时col实际是全部数值列的组合,不是单个列名。 - 参数类型不匹配:当
col是全部数值列的组合时,X_test[col].min()返回的是所有数值列的最小值组成的Series对象,而SimpleImputer的constant策略要求fill_value为单个数值,传入Series不符合参数要求,因此触发报错。 - 循环逻辑错误:即使修复列定义问题,你在循环中每次都对完整的
numeric_df做填充转换,会反复覆盖之前的填充结果,无法实现逐列填充的需求。
修复方案
推荐直接使用pandas原生方法实现,代码更简洁高效:
import pandas as pd # 提取数值列 numeric_df = X_test.select_dtypes(exclude=['object']) # 每列用自身的最小值填充缺失值 imputed_numeric_X_test = numeric_df.fillna(numeric_df.min())
如果需要使用SimpleImputer实现,正确写法如下:
from sklearn.impute import SimpleImputer numeric_df = X_test.select_dtypes(exclude=['object']) # 传入各列最小值作为对应列的填充值 my_imputer = SimpleImputer(strategy='constant', fill_value=numeric_df.min().values) imputed_numeric_X_test = pd.DataFrame( my_imputer.fit_transform(numeric_df), columns=numeric_df.columns )
内容的提问来源于stack exchange,提问作者Lehita
相关产品推荐
相关产品推荐

