基于两列组合去除Pandas DataFrame中的重复行
基于双向人员组合去重(保留消息一致的唯一行)
需求说明
需要基于person1和person2两列的双向组合删除重复行:
- 例如
person1=ryan、person2=delta与person1=delta、person2=ryan属于同一组合 - 当该组合对应的
messages值相同时,仅保留其中一行 - 所有非重复的行需完整保留
原始数据重建代码
import pandas as pd df = pd.DataFrame({"": [0,1,2,3,4,5,6], "person1": ["ryan", "delta", "delta", "delta","bravo","alpha","ryan"], "person2": ["delta", "ryan", "alpha", "bravo","delta","ryan","alpha"], "messages": [1, 1, 2, 3,3,9,9]})
原始DataFrame
person1 person2 messages 0 0 ryan delta 1 1 1 delta ryan 1 2 2 delta alpha 2 3 3 delta bravo 3 4 4 bravo delta 3 5 5 alpha ryan 9 6 6 ryan alpha 9
期望结果
finaldf person1 person2 messages 0 0 ryan delta 1 1 2 delta alpha 2 2 3 delta bravo 3 3 5 alpha ryan 9
解决方案代码
# 生成统一的双向组合键:对person1和person2排序后拼接 df['pair_key'] = df.apply(lambda row: '-'.join(sorted([row['person1'], row['person2']])), axis=1) # 基于组合键+messages去重,保留每组第一行 finaldf = df.drop_duplicates(subset=['pair_key', 'messages'], keep='first').drop(columns=['pair_key']) # 可选:重置索引 finaldf = finaldf.reset_index(drop=True)
代码说明
- 生成统一组合键:通过对每行的
person1和person2字符串排序后拼接,让双向组合(如ryan-delta和delta-ryan)生成完全相同的pair_key,统一重复判定标准 - 精准去重:使用
drop_duplicates,指定subset为pair_key和messages,确保只有当组合和消息内容都重复时才被判定为重复项 - 保留指定行:
keep='first'保留每组重复项的第一行,若需要保留最后一行可改为keep='last' - 清理临时列:删除用于辅助去重的
pair_key列,得到符合要求的干净结果
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

