缩放/标准化熊猫列

mac*_*ump 1 python pandas scikit-learn

我有一个像这样的数据框:

TOTAL | Name
3232     Jane
382      Jack
8291     Jones
Run Code Online (Sandbox Code Playgroud)

我想在数据框中创建一个新缩放的列,SIZE其中where SIZE是5到50之间的数字。

例如:

TOTAL | Name | SIZE
3232     Jane   24.413
382      Jack   10
8291     Jones  50
Run Code Online (Sandbox Code Playgroud)

我试过了

from sklearn.preprocessing import MinMaxScaler
import pandas as pd

scaler=MinMaxScaler(feature_range=(10,50))
df["SIZE"]=scaler.fit_transform(df["TOTAL"])
Run Code Online (Sandbox Code Playgroud)

但是得到了 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.

我尝试了其他方法,例如创建列表,对其进行转换并将其附加回数据框等。

最简单的方法是什么?

谢谢!

cs9*_*s95 6

选项1
sklearn
您一次又一次看到此问题,该错误确实应该指示您需要执行的操作。基本上,您在输入上缺少多余的尺寸。更改df["TOTAL"]df[["TOTAL"]]

df['SIZE'] = scaler.fit_transform(df[["TOTAL"]])
Run Code Online (Sandbox Code Playgroud)

df
   TOTAL   Name       SIZE
0   3232   Jane  24.413959
1    382   Jack  10.000000
2   8291  Jones  50.000000
Run Code Online (Sandbox Code Playgroud)

选项2
pandas
优选地,我将绕过sklearn并自己进行最小-最大缩放。

a, b = 10, 50
x, y = df.TOTAL.min(), df.TOTAL.max()
df['SIZE'] = (df.TOTAL - x) / (y - x) * (b - a) + a
Run Code Online (Sandbox Code Playgroud)

df
   TOTAL   Name       SIZE
0   3232   Jane  24.413959
1    382   Jack  10.000000
2   8291  Jones  50.000000
Run Code Online (Sandbox Code Playgroud)

从本质上讲,这就是min-max缩放器的工作,但是却没有导入scikit学习的开销(除非必须这样做,否则不要这样做,因为它是一个繁重的库)。

  • @Wen 他们的输出是在假设还有一些未显示的数据的情况下创建的。在这种有 3 行的孤立情况下,最后一个值应该是 50。但是,由于 OP 可能有 3 行以上,所以其他一些值更大,该值将变为 50。 (2认同)

Yeh*_*ter 6

如果您只想缩放数据框中的一列,则必须按如下方式重塑列值:

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df['SIZE'] = scaler.fit_transform(df['TOTAL'].values.reshape(-1,1))
Run Code Online (Sandbox Code Playgroud)