在 pandas DataFrame 上使用 scikit-learn ColumnTransfer 后保留列名称

Aca*_*pha 5 python pipeline pandas scikit-learn

我正在尝试使用 SKLearn Pipelines 和 ColumnTransformer 编写预处理。然而,变压器返回一个数组(而不是数据帧)这一事实让我有点失望。我希望也能够在已处理的 df 上使用列名称。想象一下以下数据和管道:

import pandas as pd
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer

df = pd.DataFrame(np.random.randn(6, 4), columns=list("ABCD"))
df["E"] = pd.Categorical(["test", "train", "test", "train", "test", "train"])
df["F"] = "foo"

num_columns = ['A', 'B', 'C']
num_transformer = Pipeline(
    steps=[
        ('imputer', SimpleImputer(strategy='median')),
        ('scaler', StandardScaler()),
    ]
)
cat_columns = ['E', 'F']
cat_transformer = Pipeline(
    steps = [
        ('imputer', SimpleImputer(strategy='most_frequent')),
        ('onhotencoder', OneHotEncoder())
    ]
)
preprocessor = ColumnTransformer(
    transformers=[
        ('num', num_transformer, num_columns),
        ('cat', cat_transformer, cat_columns)
    ]
)
Run Code Online (Sandbox Code Playgroud)

现在我可以获得转换后的数组

preprocessed_array = preprocessor.fit_transform(df)
Run Code Online (Sandbox Code Playgroud)

如果没有“onhotencoder”步骤,我什至可以这样做:

preprocessed_df = pd.DataFrame(preprocessed_array, columns=df.columns)
Run Code Online (Sandbox Code Playgroud)

然而,这显然是不可能的,因为“onehotencoder”步骤向数组添加了列。

还有preprocessor.get_feature_names()方法原则上应该可以工作,但它不能工作,因为像SimpleImputer这样的一些转换器没有这个方法。

有谁知道从转换另一个 df 中恢复数据帧的解决方案?

小智 1

您可以尝试附加 set_output(transform = 'pandas'),例如 SimpleImputer().set_output(transform = 'pandas')