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

ColumnTransformer异常标准化指定非标准化列问题求助

问题分析与解决方法

问题根源

你遇到的核心问题是误解了ColumnTransformer的输出列顺序,且fit_transform返回的numpy数组没有列名,导致你错误地将标准化后的数值列当成了Gender和CDR。ColumnTransformer的输出顺序严格遵循你定义的转换器顺序:

  1. 先处理num_transformer指定的数值列(Age、Educ、eTIV、nWBV、ASF)
  2. 再处理cat_transformer指定的分类列(Gender)
  3. 最后保留remainder='passthrough'指定的未被选中列(CDR)

你的代码逻辑本身没有错误,只是输出列的顺序和你预期的原DataFrame顺序不一致,导致列对应错误。

验证与修正步骤

1. 验证处理结果(明确列对应关系)

将输出转为带列名的DataFrame,就能清晰看到每一列的处理结果:

df_prepared = pd.DataFrame(
    pipeline.fit_transform(df),
    columns=num_attribs + ord_attribs + ['CDR']
)
print(df_prepared)

运行后你会看到:

  • Gender列确实是序数编码的[0,0,1,0,0,0](F被编码为0,M被编码为1)
  • CDR列完全保留了原始值[0.5,0.0,1.0,0.5,0.0,0.0]
  • 其余数值列均为标准化后的结果

2. 优化:保持原DataFrame列顺序

如果希望输出列顺序和原数据一致,可以调整ColumnTransformer的定义,按原列顺序明确指定每类列的处理规则:

# 按原DataFrame列顺序定义转换器
pipeline = ColumnTransformer([
    ("gender_encoder", cat_transformer, ['Gender']),
    ("num_scaler", num_transformer, ['Age', 'Educ', 'eTIV', 'nWBV', 'ASF']),
    ("cdr_passthrough", 'passthrough', ['CDR'])
])

# 用原列名生成结果DataFrame
df_prepared = pd.DataFrame(
    pipeline.fit_transform(df),
    columns=df.columns
)
print(df_prepared)

这样输出的列顺序和原数据完全一致,方便直接对应每一列的处理结果。

3. 自定义序数编码顺序(可选)

如果需要指定Gender的编码顺序(比如强制M为0、F为1),可以初始化OrdinalEncoder时自定义分类列表:

cat_transformer = Pipeline(
    steps=[("ordinal", OrdinalEncoder(categories=[['M', 'F']]))]
)

内容的提问来源于stack exchange,提问作者reksapj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:30:23