将MinMaxScaler()应用于pandas列

7

我正在尝试使用sklearn MinMaxScaler对类似下面的Python列进行重新缩放:

scaler = MinMaxScaler()
y = scaler.fit(df['total_amount'])

但是遇到了以下错误:

Traceback (most recent call last):
  File "/Users/edamame/workspace/git/my-analysis/experiments/my_seq.py", line 54, in <module>
    y = scaler.fit(df['total_amount'])
  File "/Users/edamame/workspace/git/my-analysis/venv/lib/python3.4/site-packages/sklearn/preprocessing/data.py", line 308, in fit
    return self.partial_fit(X, y)
  File "/Users/edamame/workspace/git/my-analysis/venv/lib/python3.4/site-packages/sklearn/preprocessing/data.py", line 334, in partial_fit
    estimator=self, dtype=FLOAT_DTYPES)
  File "/Users/edamame/workspace/git/my-analysis/venv/lib/python3.4/site-packages/sklearn/utils/validation.py", line 441, in check_array
    "if it contains a single sample.".format(array))
ValueError: Expected 2D array, got 1D array instead:
array=[3.180000e+00 2.937450e+03 6.023850e+03 2.216292e+04 1.074589e+04
   :
 0.000000e+00 0.000000e+00 9.000000e+01 1.260000e+03].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

有任何想法出了什么问题吗?

.reshape(rows_num, -1).reshape(rows_num, 1) 可以用于适应具有许多行的数据框。 - gl3yn
2个回答

14

使用MinMaxScaler的输入需要是类似数组的数据,具有 [n_samples, n_features] 的形状。因此,您可以将其应用于列作为一个数据框而不是一个系列(使用双方括号而不是单方括号):

y = scaler.fit(df[['total_amount']])

尽管从您的描述来看,您似乎想要的是 fit_transform 而不仅仅是fit(但我可能错了):

y = scaler.fit_transform(df[['total_amount']])

稍微解释一下:

如果你的数据框有100行,在将列转换为数组时,考虑形状上的差异:

>>> np.array(df[['total_amount']]).shape
(100, 1)

>>> np.array(df['total_amount']).shape
(100,)
第一个返回的形状与 MinMaxScaler 所需的形状相匹配 [n_samples, n_features],而第二个则不匹配。

1
尝试用这种方式实现:
import pandas as pd
from sklearn import preprocessing

x = df.values #returns a numpy array
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = pd.DataFrame(x_scaled)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接