对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
相关产品推荐
相关产品推荐

