【问题标题】:Convert one-hot encoded data-frame columns into one column将 one-hot 编码的数据帧列转换为一列
【发布时间】:2020-11-21 14:10:07
【问题描述】:

在 pandas 数据框中,one-hot 编码向量以列的形式存在,即:

Rows   A  B  C  D  E

0      0  0  0  1  0
1      0  0  1  0  0
2      0  1  0  0  0
3      0  0  0  1  0
4      1  0  0  0  0
4      0  0  0  0  1

如何通过在python中对它们进行标签编码,将这些列转换为一个数据框列?即:

Rows   A  

0      4 
1      3  
2      2 
3      4 
4      1  
5      5  

还需要关于某些行有多个 1 的建议,如何处理这些行,因为我们一次只能有一个类别。

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    argmax是要走的路,使用idxmax和get_indexer添加另一种方式:

    df['New'] = df.columns.get_indexer(df.idxmax(1))+1
    #df.idxmax(1).map(df.columns.get_loc)+1
    print(df)
    

    Rows  A  B  C  D  E   New
                        
    0     0  0  0  1  0    4
    1     0  0  1  0  0    3
    2     0  1  0  0  0    2
    3     0  0  0  1  0    4
    4     1  0  0  0  0    1
    5     0  0  0  0  1    5
    

    【讨论】:

    • 谢谢!如果我在数据框中还有其他浮点列,例如:X、A...D、F、G、H,您能否告诉我们如何编写它?
    • @EishaMazhar 取消选择具有非虚拟值的列。
    • 这也解决了我的问题,stackoverflow.com/questions/67977970/…,
    【解决方案2】:

    提供的其他出色解决方案之上的另一个可读解决方案适用于您的数据框中的 ANY 类型的变量:

    df['variables'] = np.where(df.values)[1]+1
    

    输出:

       A  B  C  D  E  variables
    0  0  0  0  1  0          4
    1  0  0  1  0  0          3
    2  0  1  0  0  0          2
    3  0  0  0  1  0          4
    4  1  0  0  0  0          1
    5  0  0  0  0  1          5
    

    【讨论】:

      【解决方案3】:

      还需要关于某些行有多个 1 的建议,如何 处理这些行,因为我们一次只能有一个类别。

      在这种情况下,您 dot 您的假人 DataFrame 具有 2 的所有幂的数组(基于列数)。这确保了任何唯一的假人组合(A、A+B、A+B+C、B+C、...)的存在都将具有唯一的类别标签。 (在底部添加了几行来说明唯一计数)

      df['Category'] = df.dot(2**np.arange(df.shape[1]))
      
            A  B  C  D  E  Category
      Rows                         
      0     0  0  0  1  0         8
      1     0  0  1  0  0         4
      2     0  1  0  0  0         2
      3     0  0  0  1  0         8
      4     1  0  0  0  0         1
      5     0  0  0  0  1        16
      6     1  0  0  0  1        17
      7     0  1  0  0  1        18
      8     1  1  0  0  1        19
      

      【讨论】:

      • 谢谢,如果我在数据框中还有其他浮点列,例如:X、A...D、F、G、H,您能否告诉语法?
      • @EishaMazhar 如果这些都是虚拟列,则无需更改任何内容。否则我会列出你所有的虚拟列dummy_cols = ['X', 'A', 'B', ...] 然后你可以做df[dummy_cols].dot(2**np.arange(len(dummy_cols))
      【解决方案4】:

      试试argmax

      #df=df.set_index('Rows')
      
      df['New']=df.values.argmax(1)+1
      df
      Out[231]: 
            A  B  C  D  E  New
      Rows                    
      0     0  0  0  1  0    4
      1     0  0  1  0  0    3
      2     0  1  0  0  0    2
      3     0  0  0  1  0    4
      4     1  0  0  0  0    1
      4     0  0  0  0  1    5
      

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 1970-01-01
        • 2018-01-26
        • 1970-01-01
        • 2018-03-29
        • 2023-03-13
        • 2020-05-25
        • 2022-01-19
        • 2021-08-19
        相关资源
        最近更新 更多