如何用逗号分隔的值列创建虚拟变量?

时间:2017-09-19 02:07:32

标签: python-3.x pandas scikit-learn

我正在为机器学习进行数据预处理并遇到问题。
这就是我想要做的。

表格图片:

table image

表的类型是pandas dataframe。

我当前的表只剩一个了,我想将我的表转换为右表。

电影和演员的数量并不固定。

编辑: 数据输入

 df=pd.DataFrame({'name':['A','B','C'],'actors':['a,b','b,d','c,m']})

预期产出:

       a  b  c  d  m

A      1  1  0  0  0
B      0  1  0  1  0
C      0  0  1  0  1

1 个答案:

答案 0 :(得分:3)

试试这个? (BTW,kaggle movie dataset,最好使用LabelEncoder

PS:我没有添加专栏name,你只需out['name']=df.name

选项1 pd.crosstab

df.actors=df.actors.str.split(',')
df1=df.set_index('name').actors.apply(pd.Series).stack()
pd.crosstab(df1.index.get_level_values(0),df1).rename_axis(None).rename_axis(None,1)


Out[246]: 
   a  b  c  d  m
A  1  1  0  0  0
B  0  1  0  1  0
C  0  0  1  0  1

选项2  get_dummies

pd.get_dummies(df.actors.str.split(',').apply(pd.Series).stack()).sum(level=0)

Out[230]: 
   a  b  c  d  m
0  1  1  0  0  0
1  0  1  0  1  0
2  0  0  1  0  1

选项3 MultiLabelBinarizer

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
    pd.DataFrame(mlb.fit_transform(df.actors.str.split(',')),columns=mlb.classes_,index=df.name).reset_index()
Out[238]: 
  name  a  b  c  d  m
0    A  1  1  0  0  0
1    B  0  1  0  1  0
2    C  0  0  1  0  1

数据输入

df=pd.DataFrame({'name':['A','B','C'],'actors':['a,b','b,d','c,m']})