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
相关产品推荐
相关产品推荐

