You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于姓名列的所有排列组合合并两个Pandas DataFrame

解决姓名顺序不固定的DataFrame高效合并问题

问题背景

我是Python及编程新手,手头有两个DataFrame:

  • df1是交易数据,其中姓名格式不固定,可能是「名 姓」或「姓 名」
  • df2是HR系统的规范数据,包含标准格式的姓名和对应职位
    需要基于姓名的所有可能排列组合,将df2的职位信息合并到df1中,得到类似df3的结果,且要求方法高效。了解到itertools.permutation但不知道如何实现逐行匹配。

解决方案

不需要用循环或排列组合,核心是通过标准化姓名表示来实现高效匹配:把每个姓名拆分成不区分顺序、大小写的元素集合,用这个集合作为匹配键,就能统一两种格式的姓名。

具体步骤

  1. 定义标准化函数:将姓名拆分为单词,转小写后排序,再转为元组(元组可作为DataFrame的匹配键)
  2. 给df1和df2分别生成标准化匹配键
  3. 通过匹配键合并两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:45:20