熊猫:将多个变量转换为一组虚拟变量

问题描述:

我有一个包含类别(A,B,C,D)的列,我想变成虚拟变量。问题是,该列可以包含每行多个类别,例如:熊猫:将多个变量转换为一组虚拟变量

DF = pd.DataFrame({'Col':['A', 'A, B', 'A, C', 'B, C, D', 'D']}) 

    Col 
0 A 
1 A, B 
2 A, C 
3 B, C, D 
4 D 

我在这一点想到的是第一分割使用可变分为多个字段“”作为分隔符,则伪代码的结果。事情是这样的:

DF2 = DF['Col'].str.split(', ', expand = True) 

    0 1  2 
0 A None None 
1 A B  None 
2 A C  None 
3 B C  D 
4 D None None 

pd.get_dummies(DF2) 

    0_A 0_B 0_D 1_B 1_C 2_D 
0 1 0 0 0 0 0 
1 1 0 0 1 0 0 
2 1 0 0 0 1 0 
3 0 1 0 0 1 1 
4 0 0 1 0 0 0 

最后,通过运行某种循环的跨列创建一组为A,B,C和D这可以工作虚拟变量,但得到相当繁琐了许多更多的变量/类别。有没有更简单的方法来实现这一目标?

+0

检查链接.. https://*.com/questions/46290726 /如何对化妆dummy-变量与逗号分隔值列 – Wen

简单的方法是

DF.Col.str.get_dummies(', ') 

    A B C D 
0 1 0 0 0 
1 1 1 0 0 
2 1 0 1 0 
3 0 1 1 1 
4 0 0 0 1 

稍微复杂

from sklearn.preprocessing import MultiLabelBinarizer 
from numpy.core.defchararray import split 

mlb = MultiLabelBinarizer() 
s = DF.Col.values.astype(str) 
d = mlb.fit_transform(split(s, ', ')) 

pd.DataFrame(d, columns=mlb.classes_) 

    A B C D 
0 1 0 0 0 
1 1 1 0 0 
2 1 0 1 0 
3 0 1 1 1 
4 0 0 0 1 
+0

就是这样。谢谢。 – AdmiralWen

通过使用pd.crosstab

import pandas as pd 
df = pd.DataFrame({'Col':['A', 'A,B', 'A,C', 'B,C,D', 'D']}) 
df.Col=df.Col.str.split(',') 
df1=df.Col.apply(pd.Series).stack() 
pd.crosstab(df1.index.get_level_values(0),df1) 

Out[893]: 
col_0 A B C D 
row_0    
0  1 0 0 0 
1  1 1 0 0 
2  1 0 1 0 
3  0 1 1 1 
4  0 0 0 1