如何优雅地对熊猫中的一系列列表进行热编码

时间:2018-09-05 15:49:49

标签: python python-3.x python-2.7 pandas

所以我有以下数据:

>>> test = pd.Series([['a', 'b', 'e'], ['c', 'a'], ['d'], ['d'], ['e']])
>>> test

0    [a, b, e]
1       [c, a]
2          [d]
3          [d]
4          [e]

我正在尝试将列表中的所有数据一次热编码回我的数据框中。看起来像这样:

>>> pd.DataFrame([[1, 1, 0, 0, 1], [1, 0, 1, 0, 0],
              [0, 0, 0, 1, 0], [0, 0, 0, 1, 0],
              [0, 0, 0, 0, 1]],
             columns = ['a', 'b', 'c', 'd', 'e'])

    a   b   c   d   e
0   1   1   0   0   1
1   1   0   1   0   0
2   0   0   0   1   0
3   0   0   0   1   0
4   0   0   0   0   1

我尝试研究,但发现了类似的问题,但没有一个类似的问题。我尝试过:

test.apply(pd.Series)

但是,这还不能完全解决一个热点问题。这只是以任意顺序解压缩我的列表。我确定我可以找到一个长久的解决方案,但很高兴听到是否有一种更优雅的方法来执行此操作。

谢谢!

编辑:我知道我可以遍历test系列,然后为找到的每个唯一值创建一列,然后返回并再次遍历test ,将所述列标记为唯一值。但这对我来说似乎不是很可笑,我敢肯定有一种更优雅的方法可以做到这一点。

1 个答案:

答案 0 :(得分:4)

MultiLabelBinarizer库中的

sklearn对于这些问题更为有效。与apply一起使用pd.Series应该更可取。这是一个演示:

import pandas as pd
from sklearn.preprocessing import MultiLabelBinarizer

test = pd.Series([['a', 'b', 'e'], ['c', 'a'], ['d'], ['d'], ['e']])

mlb = MultiLabelBinarizer()

res = pd.DataFrame(mlb.fit_transform(test),
                   columns=mlb.classes_,
                   index=test.index)

结果

   a  b  c  d  e
0  1  1  0  0  1
1  1  0  1  0  0
2  0  0  0  1  0
3  0  0  0  1  0
4  0  0  0  0  1