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

Python实现Excel Fuzzy Lookup匹配供应商与员工数据咨询

模糊匹配优化实现方案

现有代码核心问题

  • 时间复杂度过高:双重循环/全量笛卡尔积的逻辑时间复杂度为O(M*N),面对百万级数据完全无法运行
  • 字段关联错误:仅提取了参与匹配的字段值,没有关联对应行的全量字段,导致后续合并时出现大量NaN
  • 语法逻辑错误:第一段代码中将整数类型的相似度分值直接调用append方法,本身就会触发运行报错

前置依赖安装

使用速度更快的rapidfuzz替代原生fuzzywuzzy,同逻辑下运行速度提升10~100倍,适合大数据量场景:

pip install pandas rapidfuzz openpyxl

完整实现代码

import pandas as pd
from rapidfuzz import fuzz

# 读取数据时指定SSN为字符串类型,避免丢失前导零
df_vendor = pd.read_excel(r'Directory\Sample Vendor Data.xlsx', dtype={'SSN': str})
df_employee = pd.read_excel(r'Directory\Sample Employee Data.xlsx', dtype={'SSN': str})

# 通用模糊匹配函数
def fuzzy_match(left_df, right_df, left_col, right_col, threshold=80):
    matched_results = []
    # 遍历左表(供应商表)每一行
    for _, left_row in left_df.iterrows():
        left_val = left_row[left_col]
        # 跳过空值
        if pd.isna(left_val):
            continue
        # 遍历右表(员工表)每一行计算相似度
        for _, right_row in right_df.iterrows():
            right_val = right_row[right_col]
            if pd.isna(right_val):
                continue
            similarity = fuzz.ratio(str(left_val), str(right_val))
            if similarity >= threshold:
                # 合并左右行全量字段 + 相似度,添加后缀区分同名字段
                combined = {**left_row.add_suffix('_vendor').to_dict(), 
                            **right_row.add_suffix('_employee').to_dict(),
                            'similarity': similarity}
                matched_results.append(combined)
    return pd.DataFrame(matched_results)

# 输出1:供应商名称 和 员工名称 匹配结果
name_match_df = fuzzy_match(df_vendor, df_employee, 'Vendor Name', 'Employee Name', threshold=80)
name_match_df.to_csv(r'Directory\Name_Matching_Results.csv', encoding='utf-8-sig', index=False)

# 输出2:供应商SSN 和 员工SSN 匹配结果
ssn_match_df = fuzzy_match(df_vendor, df_employee, 'SSN', 'SSN', threshold=80)
ssn_match_df.to_csv(r'Directory\SSN_Matching_Results.csv', encoding='utf-8-sig', index=False)

超大数量优化提示

如果供应商表达到200万行,上述逐行遍历逻辑仍然较慢,可采用以下优化方案:

  1. 先对员工表的匹配字段做去重处理,减少重复计算
  2. 使用rapidfuzz.process.cdist批量计算相似度矩阵,直接过滤符合阈值的匹配对,速度提升数倍
  3. 对供应商表做分块读取匹配,避免内存溢出

内容的提问来源于stack exchange,提问作者Mystical Me

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:45:01