You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:12:42