点击上面的小蟒蛇并将其添加为星星
第一时间领取Python技术干货!
熔化
你还在为日常工作中不同数据集的字段匹配而烦恼吗?今天给大家分享一个好用的模糊字符串匹配工具包FuzzyWuzzy。让你快速、经济地解决麻烦的匹配问题!
1.前言
在处理数据的过程中,难免会遇到以下类似场景。您得到的是数据字段的简化版本,但您想要比较或合并的是完整版本的数据(有时相反)
最常见的例子是:在地理可视化过程中,对自己采集的数据只保留缩写,如北京、广西、新疆、西藏等,但要匹配的野外数据是北京、广西壮族自治区、新疆维吾尔自治区、西藏自治区等,具体如下。因此,需要有一种方法可以快速方便地直接匹配相应的字段,并将结果单独生成一列,所以我们可以使用FuzzyWuzzy库。
图书馆简介
FuzzyWuzzy是一个易于使用的模糊字符串匹配工具包。它基于Levenshtein距离算法计算两个序列之间的差值。
Levenshtein距离算法,也称为编辑距离算法,是指两个字符串之间从一个字符串转向另一个字符串所需的最小编辑操作数。允许的编辑操作包括用一个字符替换另一个字符、插入字符和删除字符。一般来说,编辑距离越小,两个字符串之间的相似度就越大。
这是Anaconda jupyter笔记本编程环境,因此在Anaconda命令行中输入一个命令,用于第三方库安装。
Pip安装-i模糊模块
模块
本文主要介绍了简单匹配(比率)、不完全匹配(部分比率)、忽略顺序匹配(令牌排序比率)和去除重复子集匹配(令牌集比率)四种功能(方法)
注意:如果直接导入此模块,系统会提示警告。当然,这并不意味着错误。程序仍然可以运行(使用默认算法,执行速度较慢)。您可以根据系统提示安装python-Levenshtein库以获得帮助,这有利于提高计算速度。
简单匹配(比率)
简单了解一下就行了。这不是很准确,也不常用
(“河南省”“河南省”)>>>(“河南省”“河南省”)>>>部分比例)
尽量使用精度更高的不完全匹配
(“河南省”“河南省”)>>>(“河南省”“河南省”)>>>忽略令牌排序比例)
原则是用空格作为分隔符,小写所有字母,忽略除空格以外的其他标点符号
(“西藏自治区”“西藏自治区”)>>>('我爱你''你爱我')>>>('西藏自治区“”西藏自治区“)>>>('我爱你''你爱我')>>>('我爱你''你爱我')>>>代币集比)
它相当于在比较之前有一个集合的去重过程。注意最后两个。可以理解,该方法是在token_sort_ratio方法的基础上增加了集合去重的功能,下面的三个匹配都是逆序的
(“西藏自治区”、“自治区西藏”)>>>(“西藏西藏自治”)
区、自治区西藏)>>>>>>>>100fuzz这些ratio()函数(方法)的最终结果都是数字,如果需要得到匹配度最高的字符串结果,还需要用自己的数据类型选择不同的函数,然后提取结果,如果这样看文本数据的匹配度,可以量化,但是我们提取匹配结果不是很方便,所以有一个过程模块。
过程模块
用于处理有限备选答案的情况,并返回模糊匹配的字符串和相似度。
提取多条数据
与爬虫中的select类似,它返回一个包含许多匹配数据的列表
选择=[“河南省”,“郑州市”,“湖北省”,“武汉市”](“郑州”,选择,limit=2)>>>[('郑州市',90),('河南省',0)]提取后的数据类型是列表,即使limit=1,最后也是列表,注意与下面的extractOne的区别。ExtractOne提取一段数据
如果要提取匹配度最大的结果,可以使用Extractone。注意这里返回的是元组类型,匹配度最大的结果不一定是我们想要的数据。您可以通过以下示例和两个实际应用程序来体验
(“郑州”,选项)>>>(“郑州”,90)(“北京”,选项)>>>(“湖北省”,45)3。实际应用
这里有两个实际应用的小例子。一是公司名称字段的模糊匹配,二是省市字段的模糊匹配
公司名称字段的模糊匹配
要匹配的数据和数据样式,如
下图:自己获取的数据字段名称很简洁,不是公司全称,需要合并两个字段
直接将代码封装为函数,主要是为了方便以后的调用。这里的参数设置比较详细,执行结果如下:
参数说明:
(1)第一个参数df_1是自己得到的待合并的左手数据(这里是数据变量);
第二个参数df2是要匹配并合并的正确数据(这里是公司变量);
③第三个参数key1是df_1中要处理的字段的名称(这里是data变量中的'company name'字段)
第四个参数key2是要在df2中匹配的字段的名称(在本例中是company变量中的“company name”字段)
⑤第五个参数阈值是设定提取结果匹配度的标准。注意,这是萃取音法的完美之处。提取的最大匹配度的结果不一定是我们需要的,所以我们需要设置一个阈值来判断,这个值就是90。只有当大于或等于90时,我们才能接受这个匹配结果
6.对于第六个参数,默认参数是只返回两个成功的匹配结果
⑦返回值:向df_1添加“matches”字段后的新DataFrame数据
核心代码解释
代码的第一部分如下所示。可以参考上面解释的方法,这里直接使用,所以返回的结果m是列表中嵌套祖先的数据格式,样式为[('郑州市',90),('河南省',0)],所以第一次写入'matches'字段的数据也是这种格式