在我的数据框中的一列中分隔类别
Separating categories within one column in my dataframe
我需要研究一下什么是最具成本效益的电影类型。我的问题是所有类型都在一个字符串中提供:
这为我提供了大约 300 个不同的独特类别。我怎样才能将它们分成大约 12 个原始虚拟流派列,以便我可以分析每个主要流派?
感谢 Yong Wang 在 pandas 中建议 get_dummies
功能。我们可以显着缩短代码:
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
意思是第一部电影属于Action, Adventure, Fantasy and Sci-Fi而不是Thriller类别,第二部电影属于Action, Adventure and Fantasy等等。最后一站是将它们组合在一起:
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
我需要研究一下什么是最具成本效益的电影类型。我的问题是所有类型都在一个字符串中提供:
这为我提供了大约 300 个不同的独特类别。我怎样才能将它们分成大约 12 个原始虚拟流派列,以便我可以分析每个主要流派?
感谢 Yong Wang 在 pandas 中建议 get_dummies
功能。我们可以显着缩短代码:
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
意思是第一部电影属于Action, Adventure, Fantasy and Sci-Fi而不是Thriller类别,第二部电影属于Action, Adventure and Fantasy等等。最后一站是将它们组合在一起:
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