如何根据列名将标签列合并到单个标签中?

时间:2019-09-12 17:52:20

标签: python pandas scikit-learn

我正在使用一个数据集,该数据集具有文本注释和每个标签可以在其下进行分类的单独列。每个注释可以分配多个标签。我想从这些标签列中创建一个汇总所有适用标签的列。

例如,使用电影类型:

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 函数的作用,但是我从多个二进制标签开始(例如已经二值化),因此很遗憾,这不是一个选择。

有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:1)

这是我使用meltgroupby的方法

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]