AttributeError: 'Series' object has no attribute 'reshape'

AttributeError: 'Series' object has no attribute 'reshape'

我正在使用 sci-kit 学习线性回归算法。 缩放 Y 目标特征时:

Ys = scaler.fit_transform(Y)

我得到了

ValueError: Expected 2D array, got 1D array instead:

之后我使用以下方式重塑:

Ys = scaler.fit_transform(Y.reshape(-1,1))

但是又报错了:

AttributeError: 'Series' object has no attribute 'reshape'

所以我检查了 pandas.Series 文档页面,它说:

reshape(*args, **kwargs) Deprecated since version 0.19.0.

解决方案已链接到 documentation page 上的重塑方法。

您需要使用

而不是 Y.reshape(-1,1)
Y.values.reshape(-1,1)

解决办法确实是这样做的:

Y.values.reshape(-1,1)

这将使用您的 pandas 系列对象的值提取一个 numpy 数组,然后将其重新整形为二维数组。

您需要这样做的原因是 pandas 系列对象在设计上是一维的。如果您想留在 pandas 库中,另一种解决方案是将 Series 转换为 DataFrame,然后将是 2D:

Y = pd.Series([1,2,3,1,2,3,4,32,2,3,42,3])

scaler = StandardScaler()

Ys = scaler.fit_transform(pd.DataFrame(Y))

你不能重塑一个pandas系列,所以你需要在一个numpy数组上执行操作。正如其他人所建议的,您可以使用 y.values.reshape(-1, 1),但是如果您想打动您的朋友,您可以使用:

y.values[Ellipsis, None]

相当于:

y.values[..., None]

它基本上是指所有维度原封不动,然后是最后一个新维度。这是一个完整的示例:

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler

y = pd.Series(np.random.rand(5))
0    0.497165
1    0.818659
2    0.327064
3    0.772548
4    0.095715
dtype: float64
scaler = StandardScaler()

scaler.fit_transform(y.values[Ellipsis, None])
array([[-0.019],
       [ 1.165],
       [-0.645],
       [ 0.995],
       [-1.496]])

使用 MinMaxScaler 将 Series 转换为 Dataframe 对我有效。

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()

Y = scaler.fit_transform(pd.DataFrame(y))