如何基于字符串包含匹配实现两个DataFrame的非等值连接
解决方案
完全可以通过正则模糊匹配完成两个DataFrame的关联,针对你给出的医院名称匹配场景,不需要复杂的实体对齐算法,通过单词边界匹配+长词优先规则就能得到完全符合预期的结果。
核心逻辑
简称都是全称中出现的独立完整单词,通过正则的单词边界符\b避免半截字符误匹配;同时针对一个全称可能命中多个简称的情况(比如Holy Mercy Hospital同时包含Holy和Mercy两个简称),按简称长度从长到短设置匹配优先级,就能匹配到你预期的对应关系。
实现代码
1. 导入依赖、初始化测试数据
import pandas as pd import re # 医院全称数据集 full_df = pd.DataFrame({ 'HOSPITAL_NAME_FULL': [ 'St. Christine', 'Californian Hospital', 'Holy Mercy Hospital', 'Germanic NW Hospital', 'Trauma Center Hospital', 'Holy Spirit Hospital', 'Mater Hospital' ] }) # 医院简称数据集 short_df = pd.DataFrame({ 'HOSPITAL_NAME_SHORT': [ 'Christine', 'Californian', 'Mercy', 'Germanic', 'Trauma', 'Holy', 'Mater' ] })
2. 构建正则匹配规则
先把所有简称按长度降序排序(保证长词优先匹配),再拼接成带单词边界的正则表达式,用re.escape转义特殊字符避免正则语法错误:
# 简称按长度从长到短排序 sorted_shorts = sorted( short_df['HOSPITAL_NAME_SHORT'].tolist(), key=lambda x: len(x), reverse=True ) # 生成正则匹配模式 match_pattern = re.compile( r'\b(' + '|'.join(map(re.escape, sorted_shorts)) + r')\b' )
3. 提取匹配结果完成关联
逐行从全称中提取命中的简称,直接得到关联后的结果集:
full_df['HOSPITAL_NAME_SHORT'] = full_df['HOSPITAL_NAME_FULL'].apply( lambda x: match_pattern.search(x).group(1) if match_pattern.search(x) else None )
运行后输出的结果和你给出的预期完全一致:
HOSPITAL_NAME_FULL HOSPITAL_NAME_SHORT 0 St. Christine Christine 1 Californian Hospital Californian 2 Holy Mercy Hospital Mercy 3 Germanic NW Hospital Germanic 4 Trauma Center Hospital Trauma 5 Holy Spirit Hospital Holy 6 Mater Hospital Mater
注意事项
- 不要省略长词排序的步骤:如果不排序直接拼接正则,
Holy Mercy Hospital会优先匹配到短词Holy,和预期结果不符 - 单词边界符
\b可以避免误匹配,比如不会把简称Cal错误匹配到全称Californian Hospital中 - 如果存在全称匹配不到任何简称的情况,代码中会返回
None,可以根据业务需求做后续处理
内容的提问来源于stack exchange,提问作者Marcos Dias
相关产品推荐
相关产品推荐

