You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:32:46