【问题标题】:One hot encoding - encode multiple columns as one一种热编码 - 将多列编码为一列
【发布时间】:2018-02-07 16:52:14
【问题描述】:

我想对具有多个相同“类型”列的数据帧进行编码,例如:

import pandas as pd

df = pd.DataFrame(data=[["France", "Bupapest", "Sweden", "Paris"], ["Italy", "Frankfurt", "France", "Naples"]], columns=["Countries 1", "Cities 1", "Countries 2", "Cities 2"])
print(df)

输出:

  Countries 1   Cities 1 Countries 2 Cities 2
0      France   Bupapest      Sweden    Paris
1       Italy  Frankfurt      France   Naples

如何通过传入应该被视为一个的列索引来使用一种热编码对该数据帧进行编码?在这个例子中,我会传入 [0, 2] 和 [1, 3] 因为国家 1 和国家 2 列组合了 3 个不同的国家,因此应该有 3 个类别,而不是每个 2 个,这两个国家的原则相同列。

【问题讨论】:

  • 想要的输出是什么?

标签: python pandas


【解决方案1】:

我正在使用 wide_to_long 展平 df ,然后使用 factorize+unstack

s=pd.wide_to_long(df.reset_index(),stubnames=['Countries','Cities'],i='index',j='unstack',sep=' ').apply(lambda x : pd.factorize(x)[0]+1).unstack()

s.columns=s.columns.map('{0[0]} {0[1]}'.format)

s=s.reindex(columns=df.columns)
s
Out[1377]: 
       Countries 1  Cities 1  Countries 2  Cities 2
index                                              
0                1         1            3         3
1                2         2            1         4

或者get_dummies

s=pd.get_dummies(pd.wide_to_long(df.reset_index(),stubnames=['Countries','Cities'],i='index',j='unstack',sep=' '))

s
Out[1392]: 
               Countries_France  Countries_Italy  Countries_Sweden  \
index unstack                                                        
0     1                       1                0                 0   
1     1                       0                1                 0   
0     2                       0                0                 1   
1     2                       1                0                 0   
               Cities_Bupapest  Cities_Frankfurt  Cities_Naples  Cities_Paris  
index unstack                                                                  
0     1                      1                 0              0             0  
1     1                      0                 1              0             0  
0     2                      0                 0              0             1  
1     2                      0                 0              1             0  

【讨论】:

  • 一个热编码意味着输出应该被二值化
  • 这只是标签编码,我需要将其输入神经网络。所有类别的权重都应该相等,但这样一来,意大利就被认为比法国“更好”,因为它的数字更高。 hackernoon.com/…
  • 如何将其转换为二维数组?当我调用 as_matrix() 时,它给了我 4 行,但应该只有 2 行,就像原来的一样。
  • @Martin s.sum(level=1)
  • 如果我调用 as_matrix() 它会给我 2 行,但这不可能是正确的:[[1 1 0 1 1 0 0] [1 0 1 0 0 1 1]]
猜你喜欢
  • 1970-01-01
  • 2020-12-22
  • 2016-03-19
  • 2020-09-25
  • 2016-03-19
  • 2023-03-06
  • 2018-11-04
相关资源
最近更新 更多