使用scikit-learn填充缺失值后列标签丢失及列顺序异常问题
数据集填充缺失值后的列标签与顺序问题解答
1. 为何Doors与Odometer (KM)列顺序颠倒?
ColumnTransformer的输出列顺序完全遵循你定义的transformer列表顺序。你当前的transformer列表依次是:
cat_imputer(对应Make、Colour)door_imputer(对应Doors)num_imputer(对应Odometer (KM))
所以输出的列顺序是Make → Colour → Doors → Odometer (KM),和原数据集的Make → Colour → Odometer (KM) → Doors顺序不一致,导致这两列颠倒。
2. 列标签去向何处?
imputer.fit_transform(X)返回的是NumPy数组,这类数组不具备列名属性。当你直接用pd.DataFrame(filled_x)转换时,Pandas会默认生成数字序列作为列索引,原数据集的列标签因此丢失。
3. 如何恢复列标签?
需要同时调整transformer顺序以匹配原数据集列序,并且在创建DataFrame时显式指定列名:
修改后的代码示例:
from sklearn.impute import SimpleImputer from sklearn.compose import ColumnTransformer import pandas as pd # 保持与原数据集一致的列顺序 cat_features = ["Make", "Colour"] num_features = ["Odometer (KM)"] door_features = ["Doors"] # 初始化填充器 cat_imputer = SimpleImputer(strategy='constant', fill_value='missing') num_imputer = SimpleImputer(strategy="mean") door_imputer = SimpleImputer(strategy='constant', fill_value=4) # 调整transformer顺序,匹配原数据集列序 imputer = ColumnTransformer([ ("cat_imputer", cat_imputer, cat_features), ("num_imputer", num_imputer, num_features), ("door_imputer", door_imputer, door_features) ]) filled_x = imputer.fit_transform(X) # 显式指定列名,与原数据集一致 new_frame = pd.DataFrame(filled_x, columns=["Make", "Colour", "Odometer (KM)", "Doors"])
如果后续需要用OneHotEncoder处理分类特征,注意ColumnTransformer搭配OneHotEncoder时会扩展分类列,此时可以通过imputer.named_transformers_['cat_imputer'].get_feature_names_out()获取编码后的列名,再与数值列、Doors列合并生成完整列名列表。
内容的提问来源于stack exchange,提问作者polkamonster
相关产品推荐
相关产品推荐

