Pandas多列去重并忽略关系方向的数据处理需求
解决DataFrame中忽略关系方向的成对列去重问题
给定如下DataFrame:
import pandas as pd data = { 'person1_name': ['John_Ethan_Wayne', 'John_Ethan_Wayne', 'Michael_Wayne', 'Michael_Wayne', 'Patrick_Wayne', 'Patrick_Wayne'], 'family1_name': ['Wayne', 'Wayne', 'Wayne', 'Wayne', 'Wayne', 'Wayne'], 'person2_name': ['Michael_Wayne', 'Patrick_Wayne', 'Patrick_Wayne', 'John_Ethan_Wayne', 'John_Ethan_Wayne', 'Michael_Wayne'], 'family2_name': ['Wayne', 'Wayne', 'Wayne', 'Wayne', 'Wayne', 'Wayne'] } df = pd.DataFrame(data)
原始数据输出:
person1_name family1_name person2_name family2_name 0 John_Ethan_Wayne Wayne Michael_Wayne Wayne 1 John_Ethan_Wayne Wayne Patrick_Wayne Wayne 2 Michael_Wayne Wayne Patrick_Wayne Wayne 3 Michael_Wayne Wayne John_Ethan_Wayne Wayne 4 Patrick_Wayne Wayne John_Ethan_Wayne Wayne 5 Patrick_Wayne Wayne Michael_Wayne Wayne
需求是忽略(person1_name, family1_name)与(person2_name, family2_name)的关系方向,去掉重复配对行(比如第0行和第3行属于同一配对,仅顺序相反,需保留其一),最终得到3行唯一结果。
解决方案
核心思路:将每行的两组人物信息打包成元组,对元组排序后生成唯一标识,再基于该标识去重。
具体代码实现:
# 生成排序后的配对唯一标识 df['pair_key'] = df.apply( lambda row: tuple(sorted([ (row['person1_name'], row['family1_name']), (row['person2_name'], row['family2_name']) ])), axis=1 ) # 按唯一标识去重,保留首次出现的行,最后删除辅助列 df_unique = df.drop_duplicates(subset='pair_key').drop(columns='pair_key') # 输出结果 print(df_unique)
执行后得到目标结果:
person1_name family1_name person2_name family2_name 0 John_Ethan_Wayne Wayne Michael_Wayne Wayne 1 John_Ethan_Wayne Wayne Patrick_Wayne Wayne 2 Michael_Wayne Wayne Patrick_Wayne Wayne
原理说明
- 把每组人物的
(姓名, 家族)打包成元组,确保每组信息的完整性; - 对两个元组排序后,无论原始顺序如何,同一配对的排序结果完全一致,生成唯一的
pair_key; - 通过
drop_duplicates基于pair_key去重,保留首次出现的行,最后移除辅助列即可得到无重复反向配对的结果。
内容的提问来源于stack exchange,提问作者Night Walker
相关产品推荐
相关产品推荐

