fuzzywuzzy库是Python中的模糊匹配库,它依据 Levenshtein Distance 算法 计算两个序列之间的差异。

Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。

安装

使用 PIP 通过 PyPI 安装

pip install fuzzywuzzy

用法

>>> from fuzzywuzzy import fuzz >>> from fuzzywuzzy import process

简单匹配(Simple Ratio)

>>> fuzz.ratio("this is a test", "this is a test!") 97

非完全匹配(Partial Ratio)

>>> fuzz.partial_ratio("this is a test", "this is a test!") 100

忽略顺序匹配(Token Sort Ratio)

>>> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 91 >>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 100

去重子集匹配(Token Set Ratio)

>>> fuzz.token_sort_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear") 84 >>> fuzz.token_set_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear") 100

Process

用来返回模糊匹配的字符串和相似度,以下的例子就返回了分数最高的两个和一个字符串。

>>> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"] >>> process.extract("new york jets", choices, limit=2) [('New York Jets', 100), ('New York Giants', 78)] >>> process.extractOne("cowboys", choices) ("Dallas Cowboys", 90)

你可以传入附加参数到 extractOne 方法来设置使用特定的匹配模式并返回和目标匹配的字符串相似度最高的字符串。

>>> process.extractOne("System of a down - Hypnotize - Heroin", songs)

('/music/library/good/System of a Down/2005 - Hypnotize/01 - Attack.mp3', 86)

>>> process.extractOne("System of a down - Hypnotize - Heroin", songs, scorer=fuzz.token_sort_ratio)

("/music/library/good/System of a Down/2005 - Hypnotize/10 - She's Like Heroin.mp3", 61

以下为实例部分:

需要将rawdata sheet中的信息与addcode中的信息进行匹配,其中caname为大类,只有大类相同才可以进行匹配。

sp_code为rawdata 表中的主键,因此我们直接将主键匹配到结果中

代码如下:

from fuzzywuzzy import fuzz

from fuzzywuzzy import process

import pandas as pd

#将需要匹配的列表放入dataframe中并将需要匹配的信息拼起来

file_path=r"fuzzywuzzy test data.xlsx"

sp_rawdata=pd.read_excel(file_path,sheet_name='rawdata',index_col='sp_code')

sp_rawdata['text']=sp_rawdata['sp_webiste']+sp_rawdata['sp_channel']+sp_rawdata['sp_position']+sp_rawdata['sp_format']

tr_rawdata=pd.read_excel(file_path,sheet_name='addcode')

tr_rawdata['text']=tr_rawdata['tr_Website']+tr_rawdata['tr_Position_Channel']+tr_rawdata['tr_Format']

#获取dataframe中cacode所有的去重后的值,并以列表的形式返回,即去重操作

sp_listtype=sp_rawdata['cacode'].unique()

tr_listtype=tr_rawdata['cacode'].unique()

scorelist=[]

rawlist=[]

#df = pd.DataFrame(columns = ["cacode", "tr_campaign_name", "tr_Website", "tr_Position_Channel", "tr_Format"])

for i in sp_listtype:

# isin()接受一个列表,判断该列中元素是否在列表中,再根据dataframe中的布尔索引进行筛选,类似的筛选函数还有 str.contains()

#在本例中,这个语句将cacode中属于1,2,3的dataframe拆分成三个列表,从而匹配两个dataframe时只会匹配cacode相同的信息

sp_data = sp_rawdata[sp_rawdata['cacode'].isin([i])]

tr_data = tr_rawdata[tr_rawdata['cacode'].isin([i])]

#按行取dataframe中的值

for row in tr_data.itertuples():

rawlist.append(row)

for text in tr_data['text']:

#忽略顺序匹配并取出匹配分数最高的值

score = process.extractOne(str(text), sp_data['text'].astype(str), scorer=fuzz.token_sort_ratio)

scorelist.append(score)

#转换list为dataframe类型

scorecode=pd.DataFrame(scorelist)

df=pd.DataFrame(rawlist)

#修改转变后的dataframe的字段名称,注意这里0和1都不是字符串

scorecode=scorecode.rename(columns={0:'sp-text',1:'score',2:"add_sp_code"})

#两个dataframe相连,axis: 需要合并链接的轴,0是行,1是列,这里按照列拼接

result=pd.concat([df,scorecode],axis=1)

result.to_excel(r" fuzzy mapping result.xlsx",index=False)

公众号:Romi的杂货铺,更多的相关文章

原 python实现模糊匹配_使用python中的fuzzywuzzy库进行模糊匹配实例相关推荐

  1. python将学号与成绩匹配_用Python运维网络(1):基础知识

    近日发现一个专栏叫<网络行者>,作者是阿卜杜拉国王科技大学的Senior Network Consultant,读了一下他的<网络工程师的Python之路>系列文章,大受启发, ...

  2. python怎样显示表格数据匹配_利用Python实现数据匹配(vlookup)

    平时我们经常会制作周报.月报这种Excel操作相同的报表,我们可以使用python的pandas库对其进行自动化.这篇文章就演示了利用python实现使用Excel中的vlookup函数,并将其脚本封 ...

  3. python图像特征提取与匹配_[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (二)...

    部分 V 图像特征提取与描述 34 角点检测的 FAST 算法 目标 • 理解 FAST 算法的基础 • 使用 OpenCV 中的 FAST 算法相关函数进行角点检测 原理 我们前面学习了几个特征检测 ...

  4. python正则表达式需要模块_使用Python正则表达式模块,让操作更加简单

    处理文本数据的一个主要任务就是创建许多以文本为基础的特性. 人们可能想要在文本中找出特定格式的内容,比如找出存在于文本中的电子邮件,或者大型文本中的电话号码. 虽然想要实现上述功能听起来很繁琐,但是如 ...

  5. python列表添加元组_【Python爬虫】列表、元组、集合练习

    列表: pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. list.append(obj) 在列表末尾添加新的对象 list.count(obj) 统计某个元素在列表 ...

  6. python queue查询空_【Python】多线程爬虫案例

    爬取博客园文章列表 爬取博客园文章列表,假设页面的URL是https://www.cnblogs.com/loaderman 要求:使用requests获取页面信息,用XPath / re 做数据提取 ...

  7. python出现的意义_[转]Python中下划线以及命名空间的意义

    Python 用下划线作为变量前缀和后缀指定特殊变量/方法. 主要存在四种情形 1. 1. object # public 2. __object__ # special, python system ...

  8. python制作图片墙_利用python生成照片墙的示例代码

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...

  9. python剪辑视频 裁剪_用python进行视频剪辑

    一.目标 python,利用moviepy和pydub将一段视频进行区间切割 二.源码 import os from moviepy.video.io.VideoFileClip import Vid ...

最新文章

  1. centos下安装apache + subversion(转)
  2. python框架django面试问别人什么问你_django面试会问什么
  3. Excel 设定密码保护特定的内容
  4. Nat. Biotechnol. | 利用深度学习从基因转录数据中预测药物疗效
  5. 查询blob字段_一次注解开发实战-我使用注解对微服务的跨库查询做了封装
  6. 真相来了!魅族再回应手机不能拨打120一事:系统升级问题
  7. netframework2.0安装
  8. 运行深度学习代码时报错RuntimeError: CUDA out of memory. Tried to allocate 482.00 MiB
  9. 网络安全——终端安全
  10. linux无线网络已连接,上不了网,无线网络连接上但上不了网的原因和解决方法
  11. NVMe ssd加速卡和NVMe ssd硬盘的区别
  12. 真c++ 从二叉树到红黑树(2)之二叉树基类
  13. KVM虚拟化使用详解--技术流ken
  14. UVALive 7279 Sheldon Numbers
  15. 史上最细Maven一条龙服务(从0到飞起)
  16. (网络编程)linux系统的远程操做
  17. WiFi开发|WiFi无线技术介绍
  18. 崔洋 mysql_MySQL数据库应用从入门到精通
  19. linux怎么安装smp系统,linux SMP系统学习笔记
  20. 生成对抗网络的背景与意义_生成对抗网络的意义

热门文章

  1. Linux安装ftp组件(vsftpd)
  2. 2020年计算机二级access考试大纲,2020年全国计算机二级ACCESS考试分析与小结(7页)-原创力文档...
  3. PHP实现微信企业付款
  4. hightcharts 3d 堆积图下钻
  5. 添加鼠标右键菜单项(EditPlus为例)
  6. 基于FFmpeg接收RTSP的ts流
  7. c++ 读取写入txt
  8. Linux fork与vfork的区别
  9. linux 加密文件,如何运用OpenSSL 对文件进行加密和解密
  10. Ubuntu18.04关闭ibus-daemon自启动