from fuzzywuzzy import fuzz
res = fuzz.ratio("江苏省","江苏省")print(res)
res = fuzz.ratio("上海","上海市")print(res)
输出
一个为100%
一个为80%
10080
fuzz模块用法2:推荐使用—非完全匹配(Partial Ratio)
非完全匹配,精度较高
from fuzzywuzzy import fuzz
res = fuzz.partial_ratio("江苏省","江苏省")print(res)
res = fuzz.partial_ratio("江苏","江苏省")print(res)
输出
两个都是显示100%
100100
fuzz模块用法3:Token Sort Ratio)
以 空格 为分隔符,小写化所有字母,无视空格外的其它标点符号
from fuzzywuzzy import fuzz
res = fuzz.ratio("西藏 自治区","自治区 西藏")print(res)
res = fuzz.ratio('I love YOU','YOU LOVE I')print(res)
res = fuzz.token_sort_ratio("西藏 自治区","自治区 西藏")print(res)
res = fuzz.token_sort_ratio('I love YOU','YOU LOVE I')print(res)
from fuzzywuzzy import fuzz,process
choices =["河南省","郑州市","湖北省","武汉市"]# res = process.extract("郑州", choices, limit=2)# print(res)
res = process.extractOne("郑州", choices)print(res)
res = process.extractOne("北京", choices)print(res)
输出
('郑州市',90)('湖北省',45)
实战应用
代码已注释
from fuzzywuzzy import fuzz, process
import pandas as pd
data = pd.read_excel('data.xlsx')
company = pd.read_excel('company.xlsx')# 模糊匹配deffuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=2):"""
:param df_1: df_1是自己获取的欲合并的左侧数据(这里是data变量)
:param df_2: df_2是待匹配的欲合并的右侧数据(这里是company变量)
:param key1: key1是df_1中要处理的字段名称(这里是data变量里的‘公司名称’字段)
:param key2: df_2中要匹配的字段名称(这里是company变量里的‘公司名称’字段)
:param threshold: threshold是设定提取结果匹配度的标准。注意这里就是对extractOne方法的完善,提取到的最大匹配度的结果并不一定是我们需要的,所以需要设定一个阈值来评判,这个值就为90,只有是大于等于90,这个匹配结果我们才可以接受
:param limit: 默认参数就是只返回两个匹配成功的结果
:return: df_1添加‘matches’字段后的新的DataFrame数据
"""
s = df_2[key2].tolist()
m = df_1[key1].apply(lambda x: process.extract(x, s, limit=limit))
df_1['matches']= m
m2 = df_1['matches'].apply(lambda x:[i[0]for i in x if i[1]>= threshold][0]iflen([i[0]for i in x if i[1]>= threshold])>0else'')
df_1['matches']= m2
return df_1
df = fuzzy_merge(data, company,'公司名称','公司名称', threshold=90)print(df)