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

Python合并difflib逐行匹配结果为DataFrame关联源数据

问题描述

读取CSV文件中两列职位名称数据,调用difflib.get_close_matches方法做相似度阈值为0.7的职位匹配时,原有代码逐行打印匹配结果,尝试转换为DataFrame时每行结果单独生成一个DataFrame对象,无法完成拼接合并。需要实现:

  • 输出结构化的单列DataFrame
  • 无匹配结果的行显示为(blank)
  • 结果可与源数据直接关联
原有实现代码
import pandas as pd
import difflib

df = pd.read_csv('name.csv')

aLists = list(df['JTs'])

bLists = list(df['JT'])

n=3
cutoff = 0.7

for aList in aLists:
    best = difflib.get_close_matches(aList, bLists, n, cutoff)
    print(best)
原有运行输出
['SW Engineer']
['Manu Engineer']
[]
['IT Help']
期望输出格式
Output
0    SW Engineer
1  Manu Engineer
2        (blank)
3        IT Help
解决方案

问题核心是循环过程中没有统一收集匹配结果,在循环内部逐次生成DataFrame自然会产生多个独立对象无法拼接。只需要在循环外初始化结果列表,逐行收集匹配到的最佳值(get_close_matches返回结果按相似度从高到低排序,取第一个即为最佳匹配),无匹配时填充(blank),最后将结果列表直接赋值为原DataFrame的新列即可,自动和源数据行索引对齐。

修正后代码:

import pandas as pd
import difflib

df = pd.read_csv('name.csv')
aLists = list(df['JTs'])
bLists = list(df['JT'])

n = 3
cutoff = 0.7
match_result = []

for item in aLists:
    best_matches = difflib.get_close_matches(item, bLists, n, cutoff)
    # 取相似度最高的第一个结果,无匹配则填(blank)
    if best_matches:
        match_result.append(best_matches[0])
    else:
        match_result.append('(blank)')

# 直接将结果作为新列加入原DataFrame,自动和源数据关联
df['Output'] = match_result

# 如需单独输出期望的单列结果,直接取对应列即可
output_df = df[['Output']]
print(output_df)

运行后输出和期望格式完全一致,且匹配结果和源数据的其他列保留对应关联关系。如果需要保留TopN匹配结果而非单个最佳匹配,只需要调整列表append的逻辑,将整个匹配列表存入即可。

内容的提问来源于stack exchange,提问作者MattGW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:57:19