如何检查DataFrame中列值顺序互换的交叉重复记录并提取?
交叉姓名重复记录提取方案
核心逻辑
我们通过生成不区分姓名顺序的唯一标识来定位交叉互换的记录,同时过滤掉完全相同的姓名记录,最终只保留名和姓交叉颠倒的重复项。
实现步骤
1. 基础实现(适合小数据集)
直接通过行遍历生成唯一键,代码易读性高:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'First Name': ['Albert', 'Einstein', 'Marie', 'Curie', 'Stephen', 'Stephen'], 'Last Name': ['Einstein', 'Albert', 'Curie', 'Marie', 'Hawking', 'Hawking'] }) # 生成不区分顺序的姓名唯一键,用特殊分隔符避免姓名本身包含空格导致的匹配错误 df['name_key'] = df.apply(lambda row: '|'.join(sorted([row['First Name'], row['Last Name']])), axis=1) # 筛选存在重复键的分组 repeat_key_groups = df.groupby('name_key').filter(lambda x: len(x) > 1) # 过滤掉组内姓名完全相同的记录,仅保留交叉互换的项 cross_dup_records = repeat_key_groups.groupby('name_key').filter( lambda group: not (group['First Name'].nunique() == 1 and group['Last Name'].nunique() == 1) ).drop(columns='name_key') print(cross_dup_records)
2. 高效实现(适合10万行以上大数据集)
用numpy向量化操作替代行遍历,性能提升10倍以上:
import numpy as np # 向量化排序生成唯一键 name_arr = np.sort(df[['First Name', 'Last Name']].values, axis=1) df['name_key'] = name_arr[:, 0] + '|' + name_arr[:, 1] # 后续筛选逻辑和基础实现完全一致 repeat_key_groups = df.groupby('name_key').filter(lambda x: len(x) > 1) cross_dup_records = repeat_key_groups.groupby('name_key').filter( lambda group: not (group['First Name'].nunique() == 1 and group['Last Name'].nunique() == 1) ).drop(columns='name_key')
输出说明
上述示例代码的输出结果如下,仅保留交叉互换的记录,完全重复的Stephen Hawking会被过滤:
| First Name | Last Name | |
|---|---|---|
| 0 | Albert | Einstein |
| 1 | Einstein | Albert |
| 2 | Marie | Curie |
| 3 | Curie | Marie |
内容的提问来源于stack exchange,提问作者Isaac A
相关产品推荐
相关产品推荐

