第一次使用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
我尝试使用以下代码仅在观察列上应用标准缩放器:
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), ['Observation'])],
remainder="passthrough")
preprocessor.fit(concat_data, concat_data['Observation'])
我收到此错误消息:
我可以在没有ColumnTransformer值错误:传递给需要二维数据的转换器的一维数据。尝试 将列选择指定为一个项目的列表,而不是 标量。
的情况下做到这一点,但我的目标是了解ColumnTransformer的工作原理。例如,此代码工作:
StandardScaler().fit(concat_data[['Observation']])
谢谢大家 !
尝试
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']])
Out[27]: pandas.core.frame.DataFrame
type(df['A'])
Out[28]: pandas.core.series.series
两种情况的输出也略有不同。
直接使用preprocessor.fit(concat_data)
,它会起作用,ColumnTransformer
期望只有一个DataFrame
而不是两个。它将自动查找列Observation
Artur Sokolovsky,我也尝试了scikit-learn的例子,但它也没有用
正如Vivek Kumar所建议的那样,这个问题是由于旧版本的scikit-learn造成的。更新到 0.20.02 解决了它。