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
相关产品推荐
相关产品推荐

