如何使用 MinMaxScaler() 将规范化应用于所有列,但排除分类?

How to apply Normalisation using the MinMaxScaler() to all Columns, but Exclude the Categorical?

我刚开始使用 MinMaxScaler,所以如果这是一个非常非常简单的问题,请不要咬我的脑袋。下面,我有以下数据集:

sample_df.head(2)

ID     S_LENGTH     S_WIDTH     P_LENGTH     P_WIDTH     SPECIES
-------------------------------------------------------------------
1      3.5          2.5          5.6         1.7        VIRGINICA
2      4.5          5.6          3.4         8.7         SETOSA

因此,如何使用下面的代码对我的所有列(不包括 IDSPECIES 列)将规范化应用于此数据集?

我基本上想使用 preprocessing.MinMaxScaler() 应用归一化,以便所有特征都在 0 和 1 的范围内。

这是我正在使用的代码...

min_max = preprocessing.MinMaxScaler()
min_max.fit_transform(sample_df)

...但是当我执行它时,我得到这个错误:

ValueError: could not convert string to float: 'SETOSA'

非常感谢任何有关如何完成我想做的事情的帮助!

此外,如果这是一个非常愚蠢的问题,我深表歉意,但我是新手

谢谢!

编辑(显示错误):

或者,如果我这样做...

min_max = preprocessing.MinMaxScaler()
min_max.fit_transform(sample_df[['S_LENGTH', 'S_WIDTH']])

sample_df.head(2)

...我收到此错误:

AttributeError: 'numpy.ndarray' object has no attribute 'sample'

我怀疑这是否会有帮助,但是您可以通过以下方式获得 numeric 列:

num_df = df[[i for i in df.columns if df[i].dtypes != 'O']]

num_df
Out[126]: 
   ID  S_LENGTH  S_WIDTH  P_LENGTH  P_WIDTH
0   1       3.5      2.5       5.6      1.7
1   2       4.5      5.6       3.4      8.7

然后在上面应用 MinMaxScaler:

min_max = preprocessing.MinMaxScaler()
min_max.fit_transform(num_df)

Out[129]:
array([[0., 0., 0., 1., 0.],
       [1., 1., 1., 0., 1.]])

编辑: 使用你的 df:

df
Out[162]: 
   ID  S_LENGTH  S_WIDTH  P_LENGTH  P_WIDTH    SPECIES
0   1       3.5      2.5       5.6      1.7  VIRGINICA
1   2       4.5      5.6       3.4      8.7     SETOSA

使用以下代码:

num_df = min_max.fit_transform(pd.DataFrame((df[[i for i in df.columns if df[i].dtypes != 'O']])))
num_df.columns = [i for i in df.columns if df[i].dtypes != 'O']
cat_df = (df[[i for i in df.columns if df[i].dtypes == 'O']])
res = pd.merge(num_df,cat_df,left_index=True,right_index=True)

这会给你:

print(res)

    ID  S_LENGTH  S_WIDTH  P_LENGTH  P_WIDTH    SPECIES
0  0.0       0.0      0.0       1.0      0.0  VIRGINICA
1  1.0       1.0      1.0       0.0      1.0     SETOSA

逐行尝试代码,如果这是您需要的,请告诉我。