如何在Power BI中实现同表内两列值相似度对比并生成布尔计算列
同表两列逐行模糊相似度对比解决方案
以下是不同工具场景下的可落地实现方案,所有方案中的相似度阈值均可根据实际业务需求调整:
1. Excel / WPS 表格实现
适合小数据量、无需编程的场景:
- 首先自定义编辑距离计算函数:按
Alt+F11打开VBA编辑器,插入模块,粘贴如下代码:
Function Levenshtein(str1 As String, str2 As String) As Integer Dim arr As Variant, i As Integer, j As Integer, str1_len As Integer, str2_len As Integer str1_len = Len(str1): str2_len = Len(str2) ReDim arr(str1_len, str2_len) For i = 0 To str1_len: arr(i, 0) = i: Next For j = 0 To str2_len: arr(0, j) = j: Next For i = 1 To str1_len For j = 1 To str2_len If Mid(str1, i, 1) = Mid(str2, j, 1) Then arr(i, j) = arr(i - 1, j - 1) Else arr(i, j) = WorksheetFunction.Min(arr(i - 1, j) + 1, arr(i, j - 1) + 1, arr(i - 1, j - 1) + 1) End If Next Next Levenshtein = arr(str1_len, str2_len) End Function
- 新增计算列,输入公式即可,示例中阈值设为60%相似度返回
True:=1-LEVENSHTEIN(A2,B2)/MAX(LEN(A2),LEN(B2))>=0.6
公式中A2、B2为你要对比的两列对应单元格,0.6为相似度阈值,可根据匹配效果调整。
2. Python Pandas 实现
适合大数据量、需要批量自动化处理的场景:
- 先安装依赖库:
pip install fuzzywuzzy python-Levenshtein - 运行如下示例代码:
import pandas as pd from fuzzywuzzy import fuzz # 读取表格,Excel格式可替换为pd.read_excel df = pd.read_csv("你的表格路径.csv") # 自定义相似度判断函数,默认阈值60,可自行调整 def is_similar(row, col1="A header", col2="Another header", threshold=60): # partial_ratio更适配短文本是长文本子串的场景,和你的需求匹配度更高 return fuzz.partial_ratio(row[col1], row[col2]) >= threshold # 生成计算列 df["Calculated Column"] = df.apply(is_similar, axis=1) # 导出结果 df.to_csv("对比结果.csv", index=False)
3. Power Query 实现
适合Power BI/Excel批量处理、无代码编程的场景:
- 先将数据加载到Power Query编辑器,新增自定义列,输入如下M语言公式即可:
let str1 = [A header], str2 = [Another header], // 编辑距离计算函数 levenshtein = (s as text, t as text) as number => let s_list = Text.ToList(s), t_list = Text.ToList(t), s_len = List.Count(s_list), t_len = List.Count(t_list), init = List.Generate(() => 0, (i) => i <= t_len, (i) => i + 1), res = List.Generate( () => [i = 0, prev = init], each [i] < s_len, each [ i = [i] + 1, curr = List.Generate( () => [j = 0, curr_val = [i] + 1], each [j] < t_len, each [ j = [j] + 1, cost = if s_list{i} = t_list{j} then 0 else 1, curr_val = List.Min({[curr_val] + 1, prev{j + 1} + 1, prev{j} + cost}) ], each [curr_val] ), prev = {[i]} & curr ], each [prev] ){s_len - 1}[prev]{t_len}, similarity = 1 - levenshtein / List.Max({Text.Length(str1), Text.Length(str2)}) in similarity >= 0.6
公式中0.6为相似度阈值,可根据实际需求调整,计算完成后加载回表格即可得到结果。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

