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

Python如何将两个DataFrame的ID模糊匹配逻辑封装为自定义函数

双DataFrame模糊匹配函数封装方案

首先修正原代码笔误:交叉连接后的结果仅包含id_number和identity_no两个匹配列,原代码中dropna指定的GST_No、GSTIN列不存在,运行会报错,封装时已修正为对两个匹配列做空值过滤。

封装后的通用函数

import pandas as pd
from fuzzywuzzy import fuzz

def fuzzy_match_score(left_df: pd.DataFrame,
                      right_df: pd.DataFrame,
                      left_match_col: str = "id_number",
                      right_match_col: str = "identity_no",
                      output_score_col: str = "match_acc") -> pd.DataFrame:
    # 提取匹配列做交叉连接
    cross_df = left_df[[left_match_col]].merge(right_df[[right_match_col]], how="cross")
    # 过滤匹配列空值,避免无效计算
    cross_df = cross_df.dropna(subset=[left_match_col, right_match_col])
    # 计算两两模糊匹配分
    cross_df["score"] = cross_df.apply(
        lambda x: fuzz.ratio(x[left_match_col], x[right_match_col]), axis=1
    )
    # 取左表每个id的最高匹配分映射回原表
    max_score_map = cross_df.groupby(left_match_col)["score"].max()
    left_df[output_score_col] = left_df[left_match_col].map(max_score_map).fillna(0).astype(int)
    return left_df

调用示例

# 读取数据源
df1 = pd.read_excel(open(r'input.xlsx', 'rb'), sheet_name='sheet1')
df2 = pd.read_excel(open(r'input.xlsx', 'rb'), sheet_name='sheet2')

# 直接调用默认参数即可匹配你的场景
result_df = fuzzy_match_score(df1, df2)

# 若需要自定义匹配列/输出列,可传参调整,例如:
# result_df = fuzzy_match_score(df1, df2, left_match_col="gst_id", right_match_col="tax_no", output_score_col="max_match")

可调整优化点

  • 匹配算法可替换:将fuzz.ratio替换为fuzz.partial_ratio、fuzz.token_sort_ratio等其他fuzzywuzzy内置算法,适配不同匹配规则
  • 无匹配项填充值调整:当前无匹配时默认填充0,可修改fillna()的参数自定义填充值
  • 大数据量优化:若两个表数据量较大,可先对两个匹配列去重后再做交叉连接,降低内存占用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 03:45:10