5

这是我第一次使用 ColumnTransformer,我遇到了数组维度的问题。

这是我的名为“concat_data”的数据框:

          Date  Hour  Observation
0  01/09/2015      0           10
1  01/09/2015      1            9
2  01/09/2015      2            8
3  01/09/2015      3           10
4  01/09/2015      4           12

我正在尝试使用以下代码仅在 Observation 列上应用标准缩放器:

preprocessor = ColumnTransformer(
        transformers=[
            ('num', StandardScaler(), ['Observation'])],
        remainder="passthrough")

preprocessor.fit(concat_data, concat_data['Observation'])

我收到此错误消息:

ValueError: 1D 数据传递给需要 2D 数据的转换器。尝试将列选择指定为一个项目的列表而不是标量。

我可以在没有 ColumnTransformer 的情况下做到这一点,但我的目标是了解 ColumnTransformer 的工作原理。例如,此代码有效:

StandardScaler().fit(concat_data[['Observation']])

谢谢大家!

4

3 回答 3

-1

尝试

preprocessor.fit(concat_data, concat_data)

或者

preprocessor.fit(concat_data, concat_data[['Observation']])

此外,可能有用:使用 ColumnTransformer 的示例

关于使用 df['A'] 和 df[['A']]

在一种情况下你仍然有一个pd.DataFrame - 使用df[['A']],在另一种情况下它被挤压到pd.Series- df['A']

pd.Series被认为是一维对象,因为它允许有一列;pd.DataFrame是一个 2D 对象,允许有多个列并进行相应处理。

df = pd.DataFrame(data=[[1,2,3,4,5],[5,4,3,2,1]],index=[0,1],columns=['A','B','C','D','E'])

type(df[['A']])

出[27]:pandas.core.frame.DataFrame

type(df['A'])

出[28]:pandas.core.series.Series

两种情况的输出也略有不同。

于 2019-01-09T12:24:01.087 回答
-1

您应该preprocessor.fit(concat_data)直接使用它会起作用,ColumnTransformer期望只有一个DataFrame而不是两个。它会自动寻找 ColumnObservation

于 2020-12-06T20:00:40.523 回答
-4

Artur Sokolovsky,我也尝试了 scikit-learn 的示例,但也没有用

正如 Vivek Kumar 所建议的,这个问题是由于旧版本的 scikit-learn 造成的。更新到 0.20.02 解决了它。

于 2019-01-09T13:29:57.910 回答