首页 > 解决方案 > k-hot 对来自多列的值进行编码

问题描述

我有pandas.DataFrame

|   | col_1 | col_2 | col_3 | col_4 |
|:--|:------|:------|:------|:------|
| 0 |   1   |   2   |  NaN  |  NaN  |
| 1 |   3   |   4   |   5   |   6   |
| 2 |   2   |   6   |  NaN  |  NaN  |

我必须将值(1、2、3、4、5、6)转换为列,如果该值在行中,则为行设置 1,否则为 0:

|   | 1 | 2 | 3 | 4 | 5 | 6 |
|:--|:--|:--|:--|:--|:--|:--|
| 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 |
| 2 | 0 | 1 | 0 | 0 | 0 | 1 |

pd.get_dummies在这里不起作用。正如我所见pd.get_dummies,one_hot 无法通过数据框列中的所有值进行编码

我怎样才能实现它?

标签: pythonpandasnumpy

解决方案


一种方法broadcasting-

In [67]: df
Out[67]: 
     0    1    2    3
0  1.0  2.0  NaN  NaN
1  3.0  4.0  5.0  6.0
2  2.0  6.0  NaN  NaN

In [68]: constant_set = [1, 2, 3, 4, 5, 6]

In [69]: (df.values[:,:,None] == constant_set).any(1).astype(int)
Out[69]: 
array([[1, 1, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 1],
       [0, 1, 0, 0, 0, 1]])

# Dataframe output
In [73]: out = (df.values[:,:,None] == constant_set).any(1).astype(int)

In [74]: pd.DataFrame(out, columns=constant_set)
Out[74]: 
   1  2  3  4  5  6
0  1  1  0  0  0  0
1  0  0  1  1  1  1
2  0  1  0  0  0  1

另一个考虑到内存效率 -

idx = np.searchsorted(constant_set, a)
out = np.zeros((len(df),len(constant_set)),dtype=int)
flattend_idx = idx + out.shape[1]*np.arange(len(idx))[:,None]
out.flat[flattend_idx[idx<len(constant_set)]] = 1

推荐阅读