【问题标题】:python pandas normalize column with keras, then splitting to groupspython pandas用keras规范化列,然后分成组
【发布时间】:2020-04-22 08:14:29
【问题描述】:

拥有如下数据框(实际数据框包含多个字符串和数字列):

col1    col2
0   A   10
1   A   10
2   B   5
3   B   5

我想根据列值对数据进行规范化,因此结果如下所示:

    col1    col2
0   A           0.632456
1   A           0.632456
2   B           0.316228
3   B           0.316228

然后将其分成组得到:

    col1    col2
0   A           0.632456
1   A           0.632456

    col1    col2
0   B           0.316228
1   B           0.316228

分组很容易,但我正在努力实现标准化。我试过使用以下代码:

from keras.utils import normalize
df = pd.DataFrame({"col1":["A","A","B","B"],"col2":[10,10,5,5]})
normalize(df, axis=0)

但由于我有字符串,它会失败,如果 A 和 B 的值是数字,它会起作用。

问:如何在不删除字符串列的情况下按列对数值进行规范化,以便以后可以分组?

【问题讨论】:

    标签: python pandas keras


    【解决方案1】:

    在处理分类数据时,您应该查看编码方法,例如 OneHotEncoder。尝试直接对这些列进行规范化是没有意义的。在这种情况下,您可以对数字列(或 keras 的 Normalize)使用诸如 MinMaxScaler 之类的缩放器,然后将分类列热编码为:

    from sklearn.preprocessing import MinMaxScaler, OneHotEncoder
    
    sc = MinMaxScaler()
    oh = OneHotEncoder()
    
    col2_norm = sc.fit_transform(df.col2.to_numpy()[:,None])
    col1_one_hot = oh.fit_transform(df.col1.to_numpy()[:,None]).toarray()
    
    np.concatenate([col1_one_hot, col2_norm], axis=1)
    array([[1., 0., 1.],
           [1., 0., 1.],
           [0., 1., 0.],
           [0., 1., 0.]])
    

    如果您只想规范化分类列,您可以将 Series 提供给缩放器,而不是整个数据框:

    sc = MinMaxScaler()
    df['col2'] = sc.fit_transform(df.col2.to_numpy()[:,None])
    

    或者类似 keras 的normalize:

    df['col2'] = normalize(df.col2.to_numpy()).squeeze()
    

    print(df)
    
      col1  col2
    0    A   1.0
    1    A   1.0
    2    B   0.0
    3    B   0.0    ​
    

    【讨论】:

    • 感谢您的回复,这不是我要找的。我并不真正关心分类列,我只是用它来获取相关序列。我需要的是标准化的数字列
    • 那么只是缩放有问题的系列@ShlomiSchwartz?更新了答案
    猜你喜欢
    • 2021-06-18
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2021-07-11
    • 2012-08-21
    • 2015-06-22
    相关资源
    最近更新 更多