使用ColumnTransformer+SimpleImputer后数据框列值错位问题求助
解决ColumnTransformer填充缺失值后列错位问题
问题原因
ColumnTransformer的输出结果是按你定义的transformers顺序拼接:先返回第一个transformer处理的所有分类列,再返回第二个transformer处理的所有数值列,和原数据框的列顺序完全无关。但你直接用原数据框的xd.columns给转换后的结果赋值列名,自然会导致列值和列名错位。
解决方案1:使用get_feature_names_out()获取正确列名
这是最简便的官方解决方案,ColumnTransformer提供了get_feature_names_out()方法,可以直接返回对应输出结果的正确列名,无需手动匹配。
修改后的完整代码:
import pandas as pd from sklearn.compose import ColumnTransformer from sklearn.impute import SimpleImputer # 定义列类型 numerical = xd.select_dtypes(exclude="object").columns categorical = xd.select_dtypes(include="object").columns preprocessor = ColumnTransformer( transformers=[ ("impute1", SimpleImputer(strategy="most_frequent"), categorical), ("impute2", SimpleImputer(strategy="median"), numerical) ] # 无需remainder="passthrough",所有列已被两个transformer覆盖 ) X_transformed = preprocessor.fit_transform(xd) # 获取匹配输出结果的正确列名 f = pd.DataFrame(X_transformed, columns=preprocessor.get_feature_names_out()) # 可选:去掉列名前的transformer前缀(如"impute1__") f.columns = f.columns.str.replace(r'^.*__', '', regex=True) f.head(3)
解决方案2:手动按原列顺序拼接处理后的列
如果需要严格保持原数据框的列顺序,可以分别处理分类和数值列,再按原顺序重新组合:
# 单独处理分类列 impute_cat = SimpleImputer(strategy="most_frequent") cat_processed = pd.DataFrame(impute_cat.fit_transform(xd[categorical]), columns=categorical) # 单独处理数值列 impute_num = SimpleImputer(strategy="median") num_processed = pd.DataFrame(impute_num.fit_transform(xd[numerical]), columns=numerical) # 按原数据框的列顺序拼接结果 f = pd.concat([cat_processed, num_processed], axis=1)[xd.columns] f.head(3)
为什么显式指定列没用?
不管是自动筛选列还是手动指定列,ColumnTransformer的输出顺序始终是第一个transformer的所有列 → 第二个transformer的所有列,和原数据框的列顺序无关,所以直接用原列名赋值必然错位。
内容的提问来源于stack exchange,提问作者Siddhant Hardikar
相关产品推荐
相关产品推荐

