如何在字符级别对句子矩阵进行一次热编码?

时间:2020-03-02 05:25:08

标签: python pandas dataframe one-hot-encoding

有一个数据框:

    0   1   2   3
0   a   c   e   NaN
1   b   d   NaN NaN
2   b   c   NaN NaN
3   a   b   c   d
4   a   b   NaN NaN
5   b   c   NaN NaN
6   a   b   NaN NaN
7   a   b   c   e
8   a   b   c   NaN
9   a   c   e   NaN

我想像这样一键转换

    a   c   e   b   d
0   1   1   1   0   0
1   0   0   0   1   1
2   0   1   0   1   0
3   1   1   0   1   1
4   1   0   0   1   0
5   0   1   0   1   0
6   1   0   0   1   0
7   1   1   1   1   0
8   1   1   0   1   0
9   1   1   1   0   0

pd.get_dummies在这里不起作用,因为它会自动对每个列进行独立编码。我怎么能得到这个?顺便说一句,列的顺序无关紧要。

2 个答案:

答案 0 :(得分:4)

尝试一下:

df.stack().str.get_dummies().max(level=0)

Out[129]:
   a  b  c  d  e
0  1  0  1  0  1
1  0  1  0  1  0
2  0  1  1  0  0
3  1  1  1  1  0
4  1  1  0  0  0
5  0  1  1  0  0
6  1  1  0  0  0
7  1  1  1  0  1
8  1  1  1  0  0
9  1  0  1  0  1

答案 1 :(得分:1)

使用str.joinstr.get_dummies的一种方式:

one_hot = df1.apply(lambda x: "|".join([i for i in x if pd.notna(i)]), 1).str.get_dummies()
print(one_hot)

输出:

   a  b  c  d  e
0  1  0  1  0  1
1  0  1  0  1  0
2  0  1  1  0  0
3  1  1  1  1  0
4  1  1  0  0  0
5  0  1  1  0  0
6  1  1  0  0  0
7  1  1  1  0  1
8  1  1  1  0  0
9  1  0  1  0  1