如何用difflib比较Pandas DataFrame两列元素并取最高相似度结果
使用difflib匹配Pandas DataFrame中相似度最高的项
可以通过difflib.SequenceMatcher计算字符串间的相似度,遍历A列每个值与B列所有值对比,找出相似度最高的项。以下是具体实现步骤:
步骤1:导入依赖库
import pandas as pd from difflib import SequenceMatcher
步骤2:定义匹配函数
这个函数接收A列的单个值和B列的所有值,返回B列中相似度最高的项及其分数:
def find_best_match(a_val, b_series): max_ratio = 0 best_match = "" # 跳过B列的空字符串,避免无效比较 valid_b = [b for b in b_series if b.strip()] if not valid_b: return ("", 0.0) for b_val in valid_b: # 统一大小写提升匹配准确性 ratio = SequenceMatcher(None, a_val.lower(), b_val.lower()).ratio() if ratio > max_ratio: max_ratio = ratio best_match = b_val return (best_match, max_ratio)
步骤3:应用函数到DataFrame
将函数应用到A列的每个元素,生成新列存储匹配结果和相似度:
# 初始化你的DataFrame df = pd.DataFrame([{'A':'horses','B':'car crash'}, {'A':'red cars in street','B':'One horse'}, {'A':'Lionel Messi','B':'an octopus in a bag'}, {'A':'white octopus in red box','B':'messi'}, {'A':'Estudiantes de La Plata','B':''}]) # 生成匹配结果 df[['匹配的B值', '相似度分数']] = df['A'].apply( lambda x: pd.Series(find_best_match(x, df['B'])) ) # 查看结果 print(df)
运行结果示例
输出的DataFrame会新增两列,展示每个A值对应的最相似B值和分数:
A B 匹配的B值 相似度分数 0 horses car crash One horse 0.538462 1 red cars in street One horse car crash 0.357143 2 Lionel Messi an octopus in a bag messi 0.615385 3 white octopus in red box messi an octopus in a bag 0.428571 4 Estudiantes de La Plata 0.000000
说明
SequenceMatcher.ratio()返回0到1之间的数值,越接近1表示相似度越高- 加入
lower()统一大小写,避免"Messi"和"messi"因为大小写被误判为低相似度 - 跳过B列的空字符串,避免无意义的比较
内容的提问来源于stack exchange,提问作者Mato
相关产品推荐
相关产品推荐

