基于姓名列的所有排列组合合并两个Pandas DataFrame
解决姓名顺序不固定的DataFrame高效合并问题
问题背景
我是Python及编程新手,手头有两个DataFrame:
- df1是交易数据,其中姓名格式不固定,可能是「名 姓」或「姓 名」
- df2是HR系统的规范数据,包含标准格式的姓名和对应职位
需要基于姓名的所有可能排列组合,将df2的职位信息合并到df1中,得到类似df3的结果,且要求方法高效。了解到itertools.permutation但不知道如何实现逐行匹配。
解决方案
不需要用循环或排列组合,核心是通过标准化姓名表示来实现高效匹配:把每个姓名拆分成不区分顺序、大小写的元素集合,用这个集合作为匹配键,就能统一两种格式的姓名。
具体步骤
- 定义标准化函数:将姓名拆分为单词,转小写后排序,再转为元组(元组可作为DataFrame的匹配键)
- 给df1和df2分别生成标准化匹配键
- 通过匹配键合并两个DataFrame,最后整理成目标格式
代码实现
import pandas as pd # 原始数据 df1 = pd.DataFrame(data=[['sravan Sudheer'], ['sudheer sravan'], ['vani radha'], ], columns=['name']) df2 = pd.DataFrame(data = [['Sudheer sravan', 'analyst'], ['radha vani','lead'], ], columns = ['hr_name', 'title']) # 标准化姓名:拆分、转小写、排序后转元组 def standardize_name(name_str): return tuple(sorted(name_str.lower().split())) # 生成匹配键 df1['match_key'] = df1['name'].apply(standardize_name) df2['match_key'] = df2['hr_name'].apply(standardize_name) # 合并并清理数据 df3 = df1.merge(df2[['match_key', 'title']], on='match_key', how='left').drop('match_key', axis=1) print(df3)
运行结果
输出的df3与目标结果完全一致:
name title 0 sravan Sudheer analyst 1 sudheer sravan analyst 2 vani radha lead
效率说明
这种方法避免了逐行循环或生成所有排列组合,时间复杂度主要来自排序操作(O(n log n)),相比O(n²)的循环方案,在数据量大时效率提升显著。
内容的提问来源于stack exchange,提问作者E Leo
相关产品推荐
相关产品推荐

