python-3.x - 如何使用逗号分隔的值列创建虚拟变量?

标签 python-3.x pandas scikit-learn

我正在从事机器学习的数据预处理工作,遇到了一个问题。
这就是我想做的。

表格图片:

table image

表的类型是 pandas dataframe。

我当前的表格是左一张,我想将我的表格转换为右一张。

电影和 Actor 的数量不固定。


编辑: 数据输入

 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

最佳答案

试试这个? (顺便说一句,kaggle 电影数据集,最好使用 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 多标签二值化器

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']})

关于python-3.x - 如何使用逗号分隔的值列创建虚拟变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46290726/

相关文章:

python - 如何读取 json-dictionary 类型的文件

python - 在 Windows 上使用 Scipy 的 AMD64 版本调用 scikit-learn 时出错

python - 基于类的装饰器和 repr() 保护

python - 如何使用解密 key 加密和解密 Pandas 数据帧?

python - 将 Excel 导入 Panda Dataframe

python - 如何迭代 Pandas 中的列值并根据同一行中多列的值创建新的观察?

python - 如何在需要 pd.get_dummies 的新数据上运行模型

python - 如何计算岭回归模型的 RMSE

python - Python 中的 AST 操作

Python 3 - 与网页交互的方式