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

Python Pandas:基于大小写不敏感且清洗后键的左外连接

Pandas左外连接:忽略大小写与特殊字符匹配解决方案

问题场景

现有两个DataFrame:

  • MASTER表(保留原始姓名格式):
FnameLnameAmount
JohnSmith-Richards
DavidO'Brien
  • ORDERS表(姓名格式不统一,含大写、空格):
FnameLnameAmount
DAVIDOBRIEN36
johnsmith richards11

需要以[Fname, Lname]为键做左外连接,匹配规则:

  1. 忽略大小写
  2. 忽略空格、短横线(-)、撇号(')这类特殊字符
  3. 最终保留MASTER的原始姓名列,以及ORDERS的Amount列

错误代码分析

你之前的代码存在三个问题:

  1. 列名不匹配:代码中用了"First Name"和"Last Name",但实际表列名是Fname和Lname,导致键生成错误
  2. 特殊字符处理不全:仅移除了空格,未处理短横线和撇号,无法完成正确匹配
  3. 直接用生成的序列作为连接键,易引发索引对齐问题

正确解决方案

步骤1:定义姓名标准化函数

统一处理姓名,生成可匹配的键:

import pandas as pd

def standardize_name(fname, lname):
    # 合并名和姓,转小写,移除所有指定特殊字符
    return (fname + lname).lower().replace(r'[\s\-']', '', regex=True)

步骤2:生成匹配键并执行连接

给两个表添加临时匹配键,再执行左外连接:

# 假设mdf是MASTER表,odf是ORDERS表
# 添加匹配键列
mdf['match_key'] = mdf.apply(lambda row: standardize_name(row['Fname'], row['Lname']), axis=1)
odf['match_key'] = odf.apply(lambda row: standardize_name(row['Fname'], row['Lname']), axis=1)

# 指定需要提取的列
mdf_cols = ["Fname", "Lname", "match_key"]
odf_cols = ["Amount", "match_key"]

# 左外连接
output_df = pd.merge(
    mdf[mdf_cols],
    odf[odf_cols],
    how='left',
    on='match_key'
)

# 删除临时匹配键
output_df.drop('match_key', axis=1, inplace=True)

执行后得到的output_df就是期望结果:

FnameLnameAmount
JohnSmith-Richards11
DavidO'Brien36

简化说明

  • 正则表达式r'[\s\-']'可以一次性匹配空格、短横线和撇号,批量移除
  • 临时键match_key仅用于连接,最终删除不影响结果
  • 左外连接确保MASTER表的所有行都被保留,匹配到的ORDERS数据会被合并进来

内容的提问来源于stack exchange,提问作者J. N.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:30:00