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

跨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'])

核心匹配逻辑

中小数据量通用方案

  1. 提取df1中所有的长COMPANY字符串,构建匹配集合
long_company_set = set(df1['COMPANY'].unique())
  1. 逐行判断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)

大数据量性能优化方案

当两个表行数较大时,双重循环遍历的速度会很慢,可以通过预编译正则表达式的方式提升匹配效率:

  1. 拼接df1所有COMPANY字符串为匹配规则,对特殊字符做正则转义,避免匹配异常
# 把长字符串集合拼接为正则匹配串,转义特殊字符
match_rule = '|'.join(re.escape(name) for name in df1['COMPANY'].unique())
  1. 逐行匹配判断
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 16:36:04