如何用fuzzy_pandas实现DataFrame精确匹配后剩余行的Levenshtein模糊匹配并返回全列
解决方案
问题分析
你遇到的核心问题是fpd.fuzzy_merge使用Levenshtein方法时仅返回匹配列,这是因为keep="match"参数会限制输出仅保留匹配相关列;另外,需要先筛选出未被精确匹配的剩余行再执行模糊匹配,避免重复处理已匹配数据。
步骤1:筛选未精确匹配的行
先通过左连接标记匹配状态,提取未匹配的行:
import pandas as pd import fuzzy_pandas as fpd # 示例数据初始化(实际场景替换为文件读取逻辑) sample_df = pd.DataFrame({ "Raw desc": ["CAULIFLOWER TRI COLOR 6 CT SAL", "!SYRUP BLACKBERRY 2LB", "PUREE BRKFST SAUSAGE LINK 24CT"], "Clean desc": ["cauliflower tri color sal", "syrup blackberry", "puree brkfst sausage link"], "Brand": ["SYSCO", "TYSON", "TYSON"] }) master_df = pd.DataFrame({ "Master raw desc": ["SYRUP & BLACKBERRY 50Z", "VEGETABLES MXD 6-10 GCHC", "3 LB PAPER FOOD BOAT 500/CS"], "Master clean desc": ["syrup blackberry", "vegetables mxd gchc", "paper food boat"], "SKU": ["2356123", "4412620", "4551210"] }) # 执行原精确匹配逻辑 results1 = fpd.fuzzy_merge( sample_df, master_df, left_on="Clean desc", right_on="Master clean desc" ) # 左连接标记匹配状态,筛选未匹配行 full_join = sample_df.merge( master_df, left_on="Clean desc", right_on="Master clean desc", how="left", indicator=True ) unmatched_df = full_join[full_join["_merge"] == "left_only"].drop(columns=["_merge", "Master raw desc", "Master clean desc", "SKU"])
步骤2:对未匹配行执行模糊匹配(保留所有列)
修改keep参数为"all",确保返回两个DataFrame的所有列:
# 执行Levenshtein模糊匹配,保留全量列 fuzzy_results = fpd.fuzzy_merge( unmatched_df, master_df, left_on="Clean desc", right_on="Master clean desc", method="levenshtein", threshold=0.85, join="left-outer", keep="all" # 关键参数:保留左右表所有字段 )
步骤3:合并最终结果
将精确匹配和模糊匹配的结果合并:
final_results = pd.concat([results1, fuzzy_results], ignore_index=True) print(final_results)
关键说明
keep="all":该参数控制输出列范围,设为"all"会保留左右DataFrame的所有字段,而非仅匹配列;- 先筛选未匹配行:避免对已精确匹配的数据重复执行模糊匹配,提升效率并防止结果冗余。
内容的提问来源于stack exchange,提问作者Linear17
相关产品推荐
相关产品推荐

