如何合并pandas DataFrame重复行以构建多标签分类训练数据集
多标签重复行合并解决方案
pandas 原生功能完全可以实现你的需求,核心逻辑是按文章唯一标识分组后对所有标签列取最大值,0/1值的max()运算刚好可以把同一篇文章所有出现过的标签位都保留为1,未出现的保留为0。
前置准备
首先确认你的 DataFrame 包含以下几类字段:
- 唯一标识字段:比如
article_id、文章标题、正文哈希值,用来识别同一篇文章 - 文本特征字段:比如
content,存储新闻正文/标题等用来训练的文本内容 - 6个标签字段:比如
label1~label6,取值均为0或1
核心实现代码
第一步:构造模拟测试数据(匹配你提到的重复场景)
import pandas as pd # 模拟你当前的重复标注数据,其中文章2符合两个标签的检索条件,存在两条重复行 raw_data = { "article_id": [1, 2, 2, 3], "content": ["新闻1正文内容", "新闻2正文内容", "新闻2正文内容", "新闻3正文内容"], "label1": [1, 1, 0, 0], "label2": [0, 0, 1, 1], "label3": [0, 0, 0, 0], "label4": [0, 0, 0, 0], "label5": [0, 0, 0, 0], "label6": [0, 0, 0, 0] } df = pd.DataFrame(raw_data)
第二步:合并重复行、整合多标签
方案1:手动指定标签列(适合标签列名固定的场景)
# 定义所有标签列的列表 label_columns = ["label1", "label2", "label3", "label4", "label5", "label6"] # 按文章唯一标识+文本字段分组,对标签列取最大值 merged_df = df.groupby(["article_id", "content"], as_index=False)[label_columns].max()
方案2:自动识别标签列(适合标签列命名有统一规律的场景)
如果你的标签列都以固定前缀命名(比如都以label开头),可以不用手动列全所有标签:
# 自动筛选所有以label开头的标签列 label_columns = [col for col in df.columns if col.startswith("label")] merged_df = df.groupby(["article_id", "content"], as_index=False)[label_columns].max()
效果说明
处理后的merged_df中,同一篇文章只会保留一条记录,所有符合检索条件的标签位都会设为1,不符合的保留0,完全匹配你需要的多标签整合需求。
注意事项
- 如果没有单独的
article_id字段,可以用hash(content)生成正文的哈希值作为唯一标识,避免内容完全相同的文章被判定为不同条目 - 如果存在部分文章没有命中任何标签的检索条件,处理后所有标签位都会保留为0,符合你的业务要求
内容的提问来源于stack exchange,提问作者DVCITIS
相关产品推荐
相关产品推荐

