跨DataFrame字符串匹配:基于COMPANY超串清理df2冗余行的方法咨询
实现步骤
前置预处理
先对两个表的COMPANY字段做基础标准化,消除无意义的匹配误差:
- 移除字段前后的多余空格
- 统一字符串大小写
- 剔除字段为空的无效值
对应代码:
import pandas as pd import re # 字段标准化 df1['COMPANY'] = df1['COMPANY'].str.strip().str.upper() df2['COMPANY'] = df2['COMPANY'].str.strip().str.upper() # 剔除无效空值 df1 = df1.dropna(subset=['COMPANY']) df2 = df2.dropna(subset=['COMPANY'])
核心匹配逻辑
中小数据量通用方案
- 提取df1中所有的长COMPANY字符串,构建匹配集合
long_company_set = set(df1['COMPANY'].unique())
- 逐行判断df2的COMPANY是否为集合内任意长字符串的子串,筛选保留匹配行
def check_match(short_name): return any(short_name in long_name for long_name in long_company_set) filtered_df2 = df2[df2['COMPANY'].apply(check_match)].reset_index(drop=True)
大数据量性能优化方案
当两个表行数较大时,双重循环遍历的速度会很慢,可以通过预编译正则表达式的方式提升匹配效率:
- 拼接df1所有COMPANY字符串为匹配规则,对特殊字符做正则转义,避免匹配异常
# 把长字符串集合拼接为正则匹配串,转义特殊字符 match_rule = '|'.join(re.escape(name) for name in df1['COMPANY'].unique())
- 逐行匹配判断
def check_fast(short_name): return bool(re.search(short_name, match_rule)) filtered_df2 = df2[df2['COMPANY'].apply(check_fast)].reset_index(drop=True)
注意事项
- 匹配方向不能反向:需求核心是df2的短COMPANY是df1长COMPANY的子串,判断逻辑是用短串去搜索长串集合,而非用长串匹配短串
- 公司名包含正则特殊符号(如括号、点、星号等)时,必须通过
re.escape转义,否则会出现匹配错误 - 如果存在部分公司名包含缩写、简称的情况,可以在标准化环节增加简称映射表进一步提升匹配准确率
内容的提问来源于stack exchange,提问作者KawaiKx
相关产品推荐
相关产品推荐

