You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:如何删除重复列值但保留指定行数据

解决Pandas去重原作者但保留所有合作者的问题

核心问题分析

你当前的drop_duplicates会对整个DataFrame的姓名列去重,不管行对应的是原作者还是合作者,所以会误删合作者的重复行。要实现需求,必须先区分原作者和合作者的行,再只对原作者的子集进行去重。

解决方案(基于常见场景)

场景1:已有原作者/合作者标识列

假设你的DataFrame有author_type列,值为'original'(原作者)或'coauthor'(合作者):

# 1. 拆分原作者和合作者数据
original_authors = df[df['author_type'] == 'original']
co_authors = df[df['author_type'] == 'coauthor']

# 2. 对原作者按姓名去重,保留第一次出现的行(keep='last'可保留最后一行)
original_authors_unique = original_authors.drop_duplicates(
    subset=['auth_given_name', 'auth_surname'],
    keep='first'
)

# 3. 合并去重后的原作者和所有合作者
result_df = pd.concat([original_authors_unique, co_authors], ignore_index=True)

场景2:无标识列,按论文内位置区分原作者

如果没有标识列,但原作者是每篇论文的第一作者(假设存在paper_id列标记同一论文):

# 1. 标记每篇论文的第一行为原作者
df['author_type'] = df.groupby('paper_id').cumcount().apply(
    lambda x: 'original' if x == 0 else 'coauthor'
)

# 2. 后续步骤同场景1
original_authors = df[df['author_type'] == 'original']
co_authors = df[df['author_type'] == 'coauthor']
original_authors_unique = original_authors.drop_duplicates(
    subset=['auth_given_name', 'auth_surname'],
    keep='first'
)
result_df = pd.concat([original_authors_unique, co_authors], ignore_index=True)

场景3:处理超大文件(适配你的分块读取)

如果文件过大,分块读取时可以提前拆分处理,避免内存溢出:

original_list = []
coauthor_list = []

# 分块读取文件
chunk_iter = pd.read_csv("merged_db.csv", encoding="unicode_escape", chunksize=50000)
for chunk in chunk_iter:
    # 这里先按场景1/2的方式标记或拆分原作者/合作者
    # 示例:假设已有author_type列
    orig_chunk = chunk[chunk['author_type'] == 'original']
    co_chunk = chunk[chunk['author_type'] == 'coauthor']
    
    # 块内原作者去重
    orig_chunk_unique = orig_chunk.drop_duplicates(
        subset=['auth_given_name', 'auth_surname'],
        keep='first'
    )
    original_list.append(orig_chunk_unique)
    coauthor_list.append(co_chunk)

# 合并所有块的数据,并全局去重原作者(避免跨块重复)
all_original_unique = pd.concat(original_list, ignore_index=True).drop_duplicates(
    subset=['auth_given_name', 'auth_surname'],
    keep='first'
)
all_coauthors = pd.concat(coauthor_list, ignore_index=True)

result_df = pd.concat([all_original_unique, all_coauthors], ignore_index=True)

关键说明

  • keep参数:keep='first'保留每个原作者的第一行,keep='last'保留最后一行,keep=False删除所有重复的原作者行(不推荐)。
  • 必须先区分原作者和合作者,否则无法实现“只删原作者重复”的需求。如果你的DataFrame有其他区分规则(比如通讯作者标记),只需要调整author_type的生成逻辑即可。

内容的提问来源于stack exchange,提问作者BBB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:05:18