Python Pandas:基于大小写不敏感且清洗后键的左外连接
Pandas左外连接:忽略大小写与特殊字符匹配解决方案
问题场景
现有两个DataFrame:
- MASTER表(保留原始姓名格式):
| Fname | Lname | Amount |
|---|---|---|
| John | Smith-Richards | |
| David | O'Brien |
- ORDERS表(姓名格式不统一,含大写、空格):
| Fname | Lname | Amount |
|---|---|---|
| DAVID | OBRIEN | 36 |
| john | smith richards | 11 |
需要以[Fname, Lname]为键做左外连接,匹配规则:
- 忽略大小写
- 忽略空格、短横线(-)、撇号(')这类特殊字符
- 最终保留MASTER的原始姓名列,以及ORDERS的Amount列
错误代码分析
你之前的代码存在三个问题:
- 列名不匹配:代码中用了
"First Name"和"Last Name",但实际表列名是Fname和Lname,导致键生成错误 - 特殊字符处理不全:仅移除了空格,未处理短横线和撇号,无法完成正确匹配
- 直接用生成的序列作为连接键,易引发索引对齐问题
正确解决方案
步骤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就是期望结果:
| Fname | Lname | Amount |
|---|---|---|
| John | Smith-Richards | 11 |
| David | O'Brien | 36 |
简化说明
- 正则表达式
r'[\s\-']'可以一次性匹配空格、短横线和撇号,批量移除 - 临时键
match_key仅用于连接,最终删除不影响结果 - 左外连接确保MASTER表的所有行都被保留,匹配到的ORDERS数据会被合并进来
内容的提问来源于stack exchange,提问作者J. N.
相关产品推荐
相关产品推荐

