我想转换这样的东西:

['dog', 'cat', 'fish', 'dog', 'dog', 'bird', 'cat', 'bird']


到布尔矩阵中,矩阵的每一列中的每一列。对于此示例,将如下所示:

(dog) (cat) (fish) (bird)
  1     0      0     0
  0     1      0     0
  0     0      1     0
  1     0      0     0
  1     0      0     0
  0     0      0     1
  0     1      0     0
  0     0      0     1


根据分类,将值设置为true的位置。我知道我可以像这样重复执行此操作(伪代码):

class = array of classifications
new = array of size [amt of classifications, len(class)]
for i, c in enumerate(class):
    if c == 'dog':
        new[i][0] = 1
    elif c == 'cat':
        new[i][1] = 1
    # and so on


我觉得在numpy或pandas中有一种更有效的方法(因为我最初将数据作为DataFrame转换为numpy数组,所以我不介意使用pandas解决方案)。

最佳答案

使用也接受get_dummieslist

a = ['dog', 'cat', 'fish', 'dog', 'dog', 'bird', 'cat', 'bird']
df = pd.get_dummies(a)
print (df)
   bird  cat  dog  fish
0     0    0    1     0
1     0    1    0     0
2     0    0    0     1
3     0    0    1     0
4     0    0    1     0
5     1    0    0     0
6     0    1    0     0
7     1    0    0     0


如果列的顺序很重要,请在reindex中添加unique

df = pd.get_dummies(a).reindex(columns=pd.unique(a))
print (df)
   dog  cat  fish  bird
0    1    0     0     0
1    0    1     0     0
2    0    0     1     0
3    1    0     0     0
4    1    0     0     0
5    0    0     0     1
6    0    1     0     0
7    0    0     0     1

关于python - 将单列分类的numpy数组/ Pandas DataFrame转换为多列 bool 矩阵(每种分类类型一列),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49013787/

10-14 01:03