300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Python模糊匹配(excel数据匹配) 比vlookup函数精度会高

Python模糊匹配(excel数据匹配) 比vlookup函数精度会高

时间:2021-09-05 13:20:40

相关推荐

Python模糊匹配(excel数据匹配) 比vlookup函数精度会高

Python模糊匹配

FuzzyWuzzy是Python中用于模糊字符串匹配的库,具有极高的准确性和效率。该库基于Levenshtein距离算法,使用字符串相似度的方法快速比较两个字符串之间的相似程度。FuzzyWuzzy提供多种比较方法,包括简单比较、部分比较、令牌排序比较和序列比较等。此外,FuzzyWuzzy还提供了模糊匹配的选项,包括模糊关键词、过滤器和截取器等。它可以广泛应用于自然语言处理、数据预处理、数据清洗、信息提取以及数据聚合等领域。FuzzyWuzzy不仅容易上手,还具有可扩展性和灵活性,可以根据实际需求进行适当的定制和调整。

本文使用FuzzyWuzzy方法,匹配excel两列数据,第一列数据循环匹配第二列数据,第三列存放匹配度最高的数据,第四列存放匹配度数值。

1、首先,需要安装FuzzyWuzzy、pandas和tqdm库

fuzzywuzzy用于计算匹配度,pandas用于读取和保存Excel文件,以及tqdm用于创建进度条。

pip install fuzzywuzzy pandas tqdm

2、读取excel数据,使用pd.read_excel方法读取Excel文件,存储到data变量中:

data = pd.read_excel('C:\\Users\\Administrator\\Desktop\\example.xls')

3、循环匹配:

定义两个空列表match_scores和pros用于存储匹配结果和匹配度数值。然后我们循环读取data中的ColA列,并使用fuzz.token_set_ratio计算其和ColB列中每一行的匹配度,依次更新最大匹配度和对应的匹配结果。循环完毕后将结果存储到match_scores和pros中。

match_scores = []pros = []for a in tqdm(data['ColA']):max_score = 0max_pro = 0max_match = ""for b in data['ColB']:score = fuzz.token_set_ratio(a, b)if score > max_score:max_score = scoremax_match = bmatch_scores.append(max_match)pros.append(max_score)

在循环中使用了tqdm函数创建了进度条,它会自动读取列表元素个数并显示匹配进度。

4、在表格后面增加两列,在循环后,将match_scores和pros两个列表的结果分别新增两列到data变量中。

data['MatchScore'] = match_scoresdata['pro'] = pros

5、空值替换,因为匹配结果可能出现空值,需要使用fillna方法将其替换为空字符串

data = data.fillna('')

6、保存Excel文件,最后使用pd.to_excel方法将结果保存到新的Excel文件中,其中index=False表示不需要写入索引数据。

data.to_excel('C:\\Users\\Administrator\\Desktop\\example1.xls', index=False)

7、完整代码

from fuzzywuzzy import fuzzimport pandas as pdfrom tqdm import tqdm# 读取Excel文件data = pd.read_excel('C:\\Users\\Administrator\\Desktop\\example.xls')# 循环匹配ColA列和ColB列数据match_scores = []pros = []# 使用tqdm库创建进度条for a in tqdm(data['ColA']):max_score = 0max_pro = 0max_match = ""for b in data['ColB']:score = fuzz.token_set_ratio(a, b)if score > max_score:max_score = scoremax_match = b# 将匹配度最高的结果加入列表中match_scores.append(max_match)pros.append(max_score)# 在DataFrame中增加两列data['MatchScore'] = match_scoresdata['pro'] = pros# 将空值替换为空字符串data = data.fillna('')# 保存结果到Excel文件data.to_excel('C:\\Users\\Administrator\\Desktop\\example2.xls', index=False)

注:此方法并不适用所有类型数据,数据匹配正确率上来看,准确率在70%-80之间,此代码中未考虑字符连续的匹配率。错误数据如下:

正常来说,110kV乌兰花变电站匹配的应该是110kV乌兰花变,但在这里匹配的是110kV乌兰镇变电站,匹配度还为91

大家有什么好的建议可以多多指教

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。