如何用Python Pandas与Difflib计算DataFrame字符串匹配相似度百分比?
解决DataFrame逐行字符串相似度打分问题
错误原因分析
Attribute Error:字符串对象无ratio属性
difflib.get_close_matches()返回的是匹配的字符串列表,不是SequenceMatcher对象,无法直接调用ratio()方法。要计算相似度,需用SequenceMatcher直接对比单个字符串对。Series对象无lower属性
Pandas的Series没有全局lower()方法,必须用str.lower()访问器对列中每个元素单独转小写。整列重复最佳匹配结果
get_close_matches()是从整个Series中筛选与目标字符串最匹配的结果,并非逐行计算。要实现逐行评估,需用apply()遍历每行数据。
修正后的代码
import difflib import pandas as pd # 读取Excel表格 df = pd.read_excel('Filename.xlsx') # 目标字符串统一转小写 target_str = 'This is my test question?'.lower() # 定义相似度计算函数 def calculate_match_score(row_str): # 确保每行内容转为字符串并小写,兼容非字符串类型数据 matcher = difflib.SequenceMatcher(None, target_str, str(row_str).lower()) # 返回百分比形式得分,保留两位小数 return round(matcher.ratio() * 100, 2) # 逐行计算匹配得分,生成新列 df['Match_percent'] = df['questions'].apply(calculate_match_score)
代码说明
- 先将目标字符串转小写,消除大小写对相似度判断的干扰。
- 用
str(row_str).lower()处理每行数据,避免Excel中可能存在的非字符串类型引发报错。 SequenceMatcher.ratio()返回0-1的相似度值,乘以100转为百分比,round()控制小数位数。apply()遍历questions列的每个元素,传入自定义函数逐行计算得分。
内容的提问来源于stack exchange,提问作者Arthur D. Howland
相关产品推荐
相关产品推荐

