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

如何基于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)

代码解释

  1. 姓名清洗:
    • 从df的Name列拆分出姓和名,去掉名里的中间名(只保留第一部分)
    • 把所有姓名转成小写,避免大小写不一致导致的匹配失败(比如John和JANE)
  2. SSN处理:
    • 两个DataFrame都提取SSN的最后四位,作为匹配的第二重依据
  3. 合并逻辑:
    • 用清洗后的名+姓+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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:04:37