我想转换这样的内容:
['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数组,所以我不会介意有一只熊猫溶液)。
答案 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