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
相关产品推荐
相关产品推荐

