ColumnTransformer 输出列顺序

问题描述 投票:0回答:1

应用 ColumnTransformer 后,我遇到列顺序问题。如果运行以下代码:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OrdinalEncoder


df = pd.DataFrame({
    'FeatureA': [1.05, 0.5, 2.5],
    'FeatureB': [0, -5, -15],
    'CatFeatureA': ['feat1', 'feat2', 'feat3'],
    'CatFeatureB': ['cat1', 'cat2', 'cat3'],
    'FeatureC': [250, 125.5, 300]
})

transformer = ColumnTransformer(
    [("drop", "drop", ["FeatureC"]),
     ("ordinal", OrdinalEncoder(), ["CatFeatureA", "CatFeatureB"])],
    remainder="passthrough"
)

features = pd.DataFrame(columns=df.drop("FeatureC", axis=1).columns, index=df.index, data=transformer.fit_transform(df))

您会注意到输出是:

Out[70]: 
   FeatureA  FeatureB  CatFeatureA  CatFeatureB
0       0.0       0.0         1.05          0.0
1       1.0       1.0         0.50         -5.0
2       2.0       2.0         2.50        -15.0

基本上,这些值与列不正确对齐:FeatureA 和 FeatureB 下的值实际上是 CatFeatureA 和 CatFeatureB 下应有的值,反之亦然。

如何确保值正确对齐?似乎用 OrdinalEncoder 编码的功能总是先行,但是我希望有一个更强大的方法,因为变压器将来可以扩展。

python pandas scikit-learn encoder
1个回答
0
投票

您的问题是由于使用或

remainder='passthrough'

正如

ColumnTransformer
文档中明确指出的:

remainder{‘drop’, ‘passthrough’}或估计器,默认=‘drop’

[...]

请注意,使用此功能需要 DataFrame 列输入 拟合和变换具有相同的顺序

这里的情况并非如此。

transformer.get_feature_names_out()

array(['ordinal__CatFeatureA', 'ordinal__CatFeatureB',
       'remainder__FeatureA', 'remainder__FeatureB'], dtype=object)

您可以使用:

features = pd.DataFrame(data=transformer.fit_transform(df),
                        index=df.index,
                        columns=transformer.get_feature_names_out(),
                       )

输出:

   ordinal__CatFeatureA  ordinal__CatFeatureB  remainder__FeatureA  remainder__FeatureB
0                   0.0                   0.0                 1.05                  0.0
1                   1.0                   1.0                 0.50                 -5.0
2                   2.0                   1.0                 2.50                -15.0
© www.soinside.com 2019 - 2024. All rights reserved.