【问题标题】:How to apply Normalisation using the MinMaxScaler() to all Columns, but Exclude the Categorical?如何使用 MinMaxScaler() 将归一化应用于所有列,但排除分类?
【发布时间】:2021-04-15 13:41:00
【问题描述】:

我是使用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'

【问题讨论】:

    标签: python pandas max min minmax


    【解决方案1】:

    我怀疑这会很有帮助,但是您可以通过以下方式获取 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
    

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

    【讨论】:

    • 嗨 - 感谢您的回复。但是当我这样做并尝试重新采样我的数据时,我收到了这个错误:AttributeError: 'numpy.ndarray' object has no attribute 'sample'
    • 你能告诉我你的代码,以便我能看到错误来自哪里吗?
    • 我已经添加了错误显示的代码。
    • 我认为这是因为MinMaxScaler 返回一个数组。尝试将您的代码更改为:import pandas as pdsample_df = pd.DataFrame(min_max.fit_transform(sample_df[['S_LENGTH', 'S_WIDTH']]))sample_df.head(2)
    • 正确。这正是我想做的。规范化数字列,但保留规范化数据框中的所有列。
    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 2022-10-15
    • 2021-07-20
    • 2016-12-02
    • 2019-06-29
    • 2010-12-13
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多