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

对numpy数组应用sklearn ColumnTransformer后如何保留原始列顺序

纯numpy数组场景下保留ColumnTransformer输出列顺序的方法

问题原因

ColumnTransformer默认的拼接逻辑是:先输出所有自定义转换器处理过的列,再输出remainder='passthrough'指定的未处理保留列,不会按照原始输入的列顺序排列,因此会出现列顺序错乱的问题。

可行方案

不需要依赖pandas DataFrame,只需要放弃全局remainder='passthrough'配置,按照原始列的索引顺序逐列(或按原始顺序分组)指定转换规则,即可保证输出列顺序和输入完全一致。

基础实现代码

import numpy as np
from sklearn.compose import ColumnTransformer 
from sklearn.preprocessing import MinMaxScaler


X = np.array([(25, 1, 2, 0),
              (30, 1, 5, 0),
              (25, 10, 2, 1),
              (25, 1, 2, 0),
              (np.nan, 10, 4, 1),
              (40, 1, 2, 1)])

# 严格按照原始列0/1/2/3的顺序配置转换规则
column_trans = ColumnTransformer(
    [
        ('scaler_col0', MinMaxScaler(), [0]),
        ('pass_col1', 'passthrough', [1]),
        ('scaler_col2', MinMaxScaler(), [2]),
        ('pass_col3', 'passthrough', [3])
    ]
)
      
X_scaled = column_trans.fit_transform(X)

列数较多时的自动配置方法

如果数组列数较多、手动逐列写配置效率低,可以通过循环自动按原始列顺序生成转换配置:

scale_cols = {0, 2}  # 在这里指定所有需要执行MinMaxScaler缩放的列索引
transformers = []

# 按原始列索引从0到最后一列的顺序遍历生成规则
for col_idx in range(X.shape[1]):
    if col_idx in scale_cols:
        transformers.append(
            (f'scaler_{col_idx}', MinMaxScaler(), [col_idx])
        )
    else:
        transformers.append(
            (f'passthrough_{col_idx}', 'passthrough', [col_idx])
        )

column_trans = ColumnTransformer(transformers)
X_scaled = column_trans.fit_transform(X)

注意事项

  • 不要将多个不连续的待缩放列合并到同一个转换器配置项中,只要配置项内的列顺序和原始索引顺序不匹配,最终输出就会出现列错乱
  • 该方法全程基于numpy数组运行,不需要引入pandas依赖,适配所有只能使用numpy数组的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 12:48:10