为了账号安全,请及时绑定邮箱和手机立即绑定

在我的数据框中的一列中分隔类别

在我的数据框中的一列中分隔类别

慕侠2389804 2022-06-02 10:19:17
我需要研究什么是最具成本效益的电影类型。我的问题是所有流派都在一个字符串中提供:这给了我大约 300 个不同的独特类别。我如何将这些分成大约 12 个原始虚拟类型列,以便我可以分析每个主要类型?
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

感谢 Yong Wang 提出了get_dummiespandas 中的功能。我们可以显着缩短代码:


df = pd.DataFrame({

    'movie_id': range(5),

    'gernes': [

                'Action|Adventure|Fantasy|Sci-Fi',

                'Action|Adventure|Fantasy',

                'Action|Adventure|Thriller',

                'Action|Thriller',

                'Action|Adventure|Sci-Fi'

              ]

})  

dummies = df['gernes'].str.get_dummies(sep='|')

final = pd.concat([df, dummies], axis=1)

结果:


   movie_id                           gernes  Action  Adventure  Fantasy  Sci-Fi  Thriller

0         0  Action|Adventure|Fantasy|Sci-Fi       1          1        1       1         0

1         1         Action|Adventure|Fantasy       1          1        1       0         0

2         2        Action|Adventure|Thriller       1          1        0       0         1

3         3                  Action|Thriller       1          0        0       0         1

4         4          Action|Adventure|Sci-Fi       1          1        0       1         0

原始答案

一种结合了 pandas 和机器学习数据准备技术的解决方案。假设您使用的是 pandas v0.25 或更高版本。


首先,让我们从您的屏幕截图中创建一个数据框:


df = pd.DataFrame({

    'movie_id': range(5),

    'gernes': [

                'Action|Adventure|Fantasy|Sci-Fi',

                'Action|Adventure|Fantasy',

                'Action|Adventure|Thriller',

                'Action|Thriller',

                'Action|Adventure|Sci-Fi'

              ]

})


   movie_id                           gernes

0         0  Action|Adventure|Fantasy|Sci-Fi

1         1         Action|Adventure|Fantasy

2         2        Action|Adventure|Thriller

3         3                  Action|Thriller

4         4          Action|Adventure|Sci-Fi

一部电影可以属于多个gernes。我们想要的是通过一个称为one-hot encoding的过程来分离这些 gernes 。我们定义类别(动作、冒险、惊悚片等)并将每部电影标记为是否属于每个类别:


from sklearn.preprocessing import OneHotEncoder


s = df['gernes'].str.split('|').explode()

encoder = OneHotEncoder()

encoded = encoder.fit_transform(s.values[:, None])

one_hot_df = pd.DataFrame(encoded.toarray(), columns=np.ravel(encoder.categories_), dtype='int') \

                .groupby(s.index) \

                .sum()


   Action  Adventure  Fantasy  Sci-Fi  Thriller

0       1          1        1       1         0

1       1          1        1       0         0

2       1          1        0       0         1

3       1          0        0       0         1

4       1          1        0       1         0

这意味着第一部电影属于动作、冒险、奇幻和科幻而不是惊悚类别,第二部电影属于动作、冒险和奇幻等。最后一站是将它们组合在一起:


final = pd.concat([df, one_hot_df], axis=1)


   movie_id                           gernes  Action  Adventure  Fantasy  Sci-Fi  Thriller

0         0  Action|Adventure|Fantasy|Sci-Fi       1          1        1       1         0

1         1         Action|Adventure|Fantasy       1          1        1       0         0

2         2        Action|Adventure|Thriller       1          1        0       0         1

3         3                  Action|Thriller       1          0        0       0         1

4         4          Action|Adventure|Sci-Fi       1          1        0       1         0


查看完整回答
反对 回复 2022-06-02
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信