单个特征的多个分类值如何使用python

时间:2016-10-30 17:14:22

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

我有一组有28列的电影数据集。其中一个是流派。对于该数据集中的每一行,列类型的值的形式为“动作|动画|喜剧|家庭|幻想”。  我想用pandas.get_dummies()对它们进行编码,但由于列有多个值,如何处理这些条件?

我附加了示例数据,但只附加了相关列Data。 我希望输出为Output

但是当我使用下面的代码将分类值转换为二进制时,

import pandas as pd
Data = pd.read_csv('sample.csv', encoding = "ISO-8859-1")
DataConverted = pd.get_dummies(Data)
DataConverted.to_csv('sample_out.csv')

输出如下所示(我无法发布两张以上的图片):

movie_title_Avatar ,movie_title_Pirates of the Caribbean: At World's End ,movie_title_Spectre ,genres_Action|Adventure|Fantasy,genres_Action|Adventure|Fantasy|Sci-Fi,genres_Action|Adventure|Thriller
1.0,0.0,0.0,0.0,1.0,0.0
0.0,1.0,0.0,1.0,0.0,0.0
0.0,0.0,1.0,0.0,0.0,1.0

1 个答案:

答案 0 :(得分:-2)

这里的这个有点棘手,但我可以保证没有多种类型。所以你可以使用2 ^ n形式的值来制作常量。例如,Action类型将具有常量值1;冒险类型可能是2;和幻想4.然后,你可以保存表演'或'或''使用常数值进行操作。例如,如果阿凡达流派是动作和幻想但不是冒险。你会像这样保存它

  const int ACTION = 1, ADVENTURE = 2, FANTASY = 4;
  movie.genre = movie.genre | ACTION | FANTASY

然后,当您阅读列性别的值时,您必须执行'和'每个常数值的操作。例如,要了解“阿凡达”的类型是否为“行动”,您只需要执行以下操作并查看它是否为“冒险”:

    if(movie.genre & ACTION == ACTION)
         print("Action movie") //will execute
    if(movie.genre & ADVENTURE == ADVENTURE)
         print("Adventure movie") //won't execute

现在,使用小数值可能对您没有意义。但你必须用二进制值来考虑这个问题; 1是0001; 2 = 0010和4 = 0100.执行'或' “阿凡达”示例中的操作将引导您使类型等于01001.在十进制枚举系统中,这是5。但是01001实际上并不是一种类型。因此,要了解电影是否属于特定类型,您必须执行“'和'使用常数值进行操作。因此,执行movie.genre&行动相当于01001& 00001 = 00001.现在,值00001是解释为ACTION的相同常量值。这意味着,阿凡达是一部动作电影,但不是冒险电影,因为01001& 00010等于零,不等于ADVENTURE(2)的常数值。