将单列分类的numpy数组/ pandas DataFrame转换为多列的布尔矩阵(每个分类类型一列)

时间:2018-02-27 16:46:16

标签: python pandas numpy

我想转换这样的内容:

['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数组,所以我不会介意有一只熊猫溶液)。

1 个答案:

答案 0 :(得分:1)

使用接受list的{​​{3}}:

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

如果列的排序很重要,请get_dummies添加reindex

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