Power BI的Power Query Editor内置模糊匹配失效,如何用Python合并表?
解决Power Query模糊匹配错误,实现精准表关联的方案
一、Power Query内的简便优化方案
针对内置模糊匹配适配单词语句的局限性,不用额外工具的话,可以通过自定义匹配规则或手动实现精准相似度算法来解决:
1. 提取核心匹配字段
先从两个表的Name字段中提取核心标识(比如品牌前缀+型号),再基于提取后的字段做精确或模糊匹配:
- 比如针对
Apple Fruit A11,用正则表达式提取Apple A11;针对Apple A11R/T,同样提取Apple A11,这样就能让同品牌同型号的条目匹配。 - Power Query中可以用
Text.RegularExpressions.Match实现提取,示例M函数:
let ExtractCore = (inputText as text) as text => let // 匹配品牌(大写开头字母)+ 型号(字母+数字+特殊字符) regexMatch = Text.RegularExpressions.Match(inputText, "([A-Z][a-z]+)\s+.*?([A-Z0-9\/]+)"), coreText = regexMatch.Groups(1).Value & " " & regexMatch.Groups(2).Value in coreText in ExtractCore
给Table1和Table2都添加提取后的核心字段,再用这个字段做精确匹配即可。
2. 自定义编辑距离(Levenshtein)匹配
如果需要保留原字段匹配,可手动实现编辑距离算法,筛选最相似的条目:
- 写一个计算两个字符串编辑距离的M函数,然后对Table1的每个
Name,遍历Table2计算距离,取距离最小的匹配项(同时可设置距离阈值过滤无效匹配)。
二、Python基于字符串相似度的实现方法
用pandas结合rapidfuzz(比fuzzywuzzy更快)可以灵活控制匹配逻辑,精准解决这类问题:
实现步骤与代码
import pandas as pd from rapidfuzz import process, fuzz # 读取两个表(根据实际数据源调整,比如csv/excel) table1 = pd.read_excel("table1.xlsx") table2 = pd.read_excel("table2.xlsx") # 定义匹配函数:返回匹配到的Table2的Name和Value def match_table2_info(name): # 使用token_set_ratio算法:忽略单词顺序、重复,聚焦核心词匹配 # 适合处理带额外描述的名称(比如"Apple Fruit A11"和"Apple A11R/T") best_match = process.extractOne(name, table2["Name"], scorer=fuzz.token_set_ratio) match_name, score, _ = best_match # 设置相似度阈值(可根据需求调整,比如80分以上视为有效匹配) if score >= 80: matched_value = table2.loc[table2["Name"] == match_name, "Value"].iloc[0] return (match_name, matched_value) else: return (None, None) # 给Table1添加匹配结果 table1[["Matched_Table2_Name", "Matched_Value"]] = table1["Name"].apply( lambda x: pd.Series(match_table2_info(x)) ) # 输出或保存结果 print(table1) # table1.to_excel("matched_result.xlsx", index=False)
关键说明
token_set_ratio算法会把字符串拆分为单词集合,对比集合的交集与并集比例,能有效忽略Fruit这类冗余描述,让Apple Fruit A11与Apple A11R/T的相似度远高于和Berry A11的相似度,避免错误匹配。- 可根据实际数据调整相似度阈值(比如从70到90),平衡匹配准确率和召回率。
内容的提问来源于stack exchange,提问作者Gustavo Schettino
相关产品推荐
相关产品推荐

