我正在使用一个数据集,该数据集具有文本注释和每个标签可以在其下进行分类的单独列。每个注释可以分配多个标签。我想从这些标签列中创建一个汇总所有适用标签的列。
例如,使用电影类型:
sample_df = pd.DataFrame({'Movie Title':['Movie 1', 'Movie 2', 'Movie 3', 'action': [0, 1, 0], 'comedy': [1, 1, 0], 'drama': [0, 1, 1]})
print(sample_df)
Movie Title action comedy drama
Movie 1 1 1 1
Movie 2 1 0 1
Movie 3 0 0 1
添加标签摘要列后,数据集应如下所示:
Movie Title action comedy drama genres
Movie 1 1 1 1 [action, comedy, drama]
Movie 2 1 0 1 [action, drama]
Movie 3 0 0 1 [drama]
这正是sklearn.preprocessing.MultiLabelBinarizer
的 inverse_transform 函数的作用,但是我从多个二进制标签开始(例如已经二值化),因此很遗憾,这不是一个选择。
有什么想法吗?谢谢!
答案 0 :(得分:1)
这是我使用melt
和groupby
的方法
s = sample_df.melt('Movie Title', var_name='genres')
new_df = s[s['value'].eq(1)].groupby('Movie Title').genres.apply(list)
sample_df.merge(new_df, on='Movie Title')
输出:
Movie Title action comedy drama genres
0 Movie 1 1 1 1 [action, comedy, drama]
1 Movie 2 1 0 1 [action, drama]
2 Movie 3 0 0 1 [drama]
答案 1 :(得分:1)
您可以使用列表理解功能对列进行切片:
s = df.iloc[:, 1:]
df['genres'] = [s.columns[x].to_list() for x in s.astype(bool).to_numpy()]
# Movie Title action comedy drama genres
#0 Movie 1 0 1 0 [comedy]
#1 Movie 2 1 1 1 [action, comedy, drama]
#2 Movie 3 0 0 1 [drama]
答案 2 :(得分:1)
让我们使用@WenYoBen剧本中的dot
进行尝试。
sample_df['genres'] = sample_df.iloc[:, 1:].dot(sample_df.columns[1:] + ',').str[:-1].str.split(',')
sample_df
输出:
Movie Title action comedy drama genres
0 Movie 1 0 1 0 [comedy]
1 Movie 2 1 1 1 [action, comedy, drama]
2 Movie 3 0 0 1 [drama]