如何基于SSN后4位及格式不一致的姓名合并两个Pandas DataFrame
如何基于SSN后4位及格式不一致的姓名合并两个Pandas DataFrame
看起来你已经精准抓到了问题的核心——仅靠SSN后四位匹配确实有重复风险,必须结合姓名做双重校验才行。我来帮你调整下方案,解决姓名格式不统一和匹配键错误的问题:
先说说你现有代码的小问题
你之前生成了SSN_Last_4列,但合并的时候却用了原始的SSN列做匹配键——可df里的SSN是掩码后的,和Employee_Info的完整SSN完全对不上,这肯定出不来正确结果呀😅
正确的解决思路
咱们需要先把两个DataFrame的姓名格式统一清洗(忽略中间名、统一大小写),再结合SSN后四位做双重匹配,这样就能最大程度避免匹配错误了。
完整代码实现
import pandas as pd # 处理df的姓名和SSN # 从Name列拆分出姓和名(比如Doe, John A → Last_Name=Doe, First_Name=John A) df[['Last_Name', 'First_Name']] = df['Name'].str.split(', ', expand=True) # 清洗姓名:去掉中间名,转小写统一格式 df['First_Clean'] = df['First_Name'].str.split().str[0].str.lower() df['Last_Clean'] = df['Last_Name'].str.lower() # 提取SSN后四位 df['SSN_Last4'] = df['SSN'].str[-4:] # 处理Employee_Info的姓名和SSN Employee_Info['First_Clean'] = Employee_Info['First_Name'].str.lower() Employee_Info['Last_Clean'] = Employee_Info['Last_Name'].str.lower() Employee_Info['SSN_Last4'] = Employee_Info['SSN'].str[-4:] # 基于清洗后的姓名 + SSN后四位做合并 merged_df = pd.merge( df, Employee_Info[['First_Clean', 'Last_Clean', 'SSN_Last4', 'EmployeeID']], on=['First_Clean', 'Last_Clean', 'SSN_Last4'], how='left' ) # 整理成你想要的输出格式 final_df = merged_df[['Name', 'SSN', 'EmployeeID']] # 可选:如果需要把SSN改成XXX-XX-XXXX格式,执行下面的代码 # final_df['SSN'] = 'XXX-XX-' + final_df['SSN'].str[-4:] print(final_df)
代码解释
- 姓名清洗:
- 从
df的Name列拆分出姓和名,去掉名里的中间名(只保留第一部分) - 把所有姓名转成小写,避免大小写不一致导致的匹配失败(比如John和JANE)
- 从
- SSN处理:
- 两个DataFrame都提取SSN的最后四位,作为匹配的第二重依据
- 合并逻辑:
- 用清洗后的名+姓+SSN后四位三个键做合并,三重匹配几乎能杜绝误匹配的情况
- 用
how='left'保证df里的所有行都被保留,和你的需求一致
输出结果
运行后就能得到你想要的格式:
Name SSN EmployeeID Doe, John A XXXX-XX-1234 12 Doe, Jane B XXXX-XX-9876 13 Test, Example XXXX-XX-0192 14
备注:内容来源于stack exchange,提问作者Bijan
相关产品推荐
相关产品推荐

