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 = 0
    max_pro = 0
    max_match = ""
    for b in data['ColB']:
        score = fuzz.token_set_ratio(a, b)
        if score > max_score:
            max_score = score
            max_match = b
    match_scores.append(max_match)
    pros.append(max_score)

在循环中使用了tqdm函数创建了进度条,它会自动读取列表元素个数并显示匹配进度。
4、在表格后面增加两列,在循环后,将match_scores和pros两个列表的结果分别新增两列到data变量中。

data['MatchScore'] = match_scores
data['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 fuzz
import pandas as pd
from 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 = 0
    max_pro = 0
    max_match = ""
    for b in data['ColB']:
        score = fuzz.token_set_ratio(a, b)
        if score > max_score:
            max_score = score
            max_match = b
    # 将匹配度最高的结果加入列表中
    match_scores.append(max_match)
    pros.append(max_score)

# 在DataFrame中增加两列
data['MatchScore'] = match_scores
data['pro'] = pros

# 将空值替换为空字符串
data = data.fillna('')

# 保存结果到Excel文件
data.to_excel('C:\\Users\\Administrator\\Desktop\\example2.xls', index=False)

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

ColA ColB MatchScore pro
110kV乌兰花变电站 110kV乌兰花变 110kV乌兰镇变电站 91

正常来说,110kV乌兰花变电站匹配的应该是110kV乌兰花变,但在这里匹配的是110kV乌兰镇变电站,匹配度还为91
大家有什么好的建议可以多多指教

你可能感兴趣的:(python,python,pandas)