如何用列表中的单词制作一个二进制熊猫矩阵?

时间:2019-05-06 07:14:48

标签: python pandas matrix

我有一个数据框,其中的一列包含每一行的列表:

<html>


<head>
    <meta charset="UTF-8">
    <script src="https://aframe.io/releases/0.9.1/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
      <a-text value="This is the text" font="Roboto-msdf.json"></a-text>
    </a-scene>
  </body>
</html>

现在,我想以此为基础创建一个二进制矩阵,以字母作为列名,如果该行上的列表包含字母,则返回1,如果不是0,则无法找到解决方案。有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

如果性能很重要,请使用MultiLabelBinarizer: :

df = pd.DataFrame({'list1':[ ['a','b','c','d'], ['b','c','d', 'e']]})
print (df)
          list1
0  [a, b, c, d]
1  [b, c, d, e]

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df1 = pd.DataFrame(mlb.fit_transform(df['list1']),columns=mlb.classes_)

或者将get_dummiesDataFrame的构造函数一起使用:

df1 = (pd.get_dummies(pd.DataFrame(df['list1'].values.tolist()), prefix_sep='', prefix='')
         .max(level=0, axis=1))

另一种解决方案,但是如果将Series.str.joinSeries.str.get_dummies一起使用,则速度较慢:

df1 = df['list1'].str.join('|').str.get_dummies()

print (df1)
   a  b  c  d  e
0  1  1  1  1  0
1  0  1  1  1  1

编辑:如果需要删除了list1列的原始列,请使用DataFrame.pop提取具有DataFrame.join的列:

df = pd.DataFrame({'list1':[ ['a','b','c','d'], ['b','c','d', 'e']],
                   'col1':[1,2],
                   'col2':list('XY')})
print (df)
          list1  col1 col2
0  [a, b, c, d]     1    X
1  [b, c, d, e]     2    Y

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df1 = pd.DataFrame(mlb.fit_transform(df.pop('list1')),columns=mlb.classes_, index=df.index)
print (df1)
   a  b  c  d  e
0  1  1  1  1  0
1  0  1  1  1  1

df1 = (pd.get_dummies(pd.DataFrame(df.pop('list1').values.tolist()), prefix_sep='', prefix='')
         .max(level=0, axis=1))

df1 = df.pop('list1').str.join('|').str.get_dummies()

df = df.join(df1)
print (df)
   col1 col2  a  b  c  d  e
0     1    X  1  1  1  1  0
1     2    Y  0  1  1  1  1