通过python模糊匹配算法对两个excel表格内容归类
作者:二十六夜. 发布时间:2023-02-14 20:57:49
一、问题描述
在实习的时候,需要将两个表格的内容进行匹配分类,比如两个不同的工程项目针对的对象都是A,那么就需要将这两个工程项目归类到A当中,而这当中的工程项目和施工对象数量都还挺多的,因此想着写个程序来自动将它们归类起来,这样可以减少很大一部分的工作量。
二、运用方法
由于两个表格中拥有相似的关键词,即一个表格的内容形式为为A工程项目,另一个表格的内容形式为A单位,那么我就需要将其中的“A”这个关键词相匹配就能够筛选出来了。能够达到目的的程序写法有不少,而我在这次的问题中选择了通过模糊匹配的算法来实现该功能。
三、代码编写
注:这里我们导入了difflib库,用于使用模糊匹配算法;xlwt库,用于导出excel表格
3.1
首先我们导入两个需要处理的excel表格。
df1=pd.read_excel(r'D:\杂货\项目.xlsx',sheet_name='Sheet1')
df2=pd.read_excel(r'D:\杂货\项目2.xlsx',sheet_name='Sheet1')#导入两个需要处理的excel表格
两个表格的内容形式大致如上。而我的需求是将这两个表格相关的工程项目匹配归类。
导入方法不再赘述,详见:
如何在Python中导入EXCEL数据
3.2
再将我们所要处理的两列数据放入一个列表当中。
for i in df1['XXXXXX改造']:#将这两列的数据存入list1和list2两个列表中
list1.append(i)
for j in df2['XXXXXX新改']:
list2.append(j)
3.3
通过模糊匹配算法,将list2中的数据内容与list1中的数据内容一一匹配。
for n in range(len(list2)):#通过模糊匹配算法,将list2与list1中的数据一一匹配,设置近似度为42%,得到匹配结果res
query_word=str(list2[n])
res=difflib.get_close_matches(query_word,list1,1,cutoff=0.42)
res = "".join(res)
listx.append(res)
需要注意的是,该处调用了difflib库中的get_close_matches(query_word,list1,n,cutoff)方法,其中的query_word为被匹配的字符串;list1为要匹配的字符串列表;n为前topn个最佳匹配反回,我将其设置为1;cutoff为匹配度大小,为[0,1]的浮点数,也可以称为两者的相似程度,这个就看个人需求和具体问题来设置,我将其相似程度设置为0.42则恰好能够将我所需要匹配的两个表格的内容都匹配成功。
由于res匹配出来的每一个结果都是是列表的形式,而我们想要将结果写入新的表格当中需要字符串形式的结果,因此使用res=””.join(res)方法将列表转换为字符串的形式,然后将字符串形式的结果放入listx列表当中,以便于写入新的excel表格。
3.4
由于担心会存在匹配结果遗漏的情况出现,因此我又将list1中的数据内容与list2中的数据内容一一匹配。
for m in range(len(list1)):#同上,将list1与list2的数据一一匹配
query_word=str(list1[m])
res=difflib.get_close_matches(query_word,list2,1,cutoff=0.42)
res="".join(res)
listy.append(res)
这时我将被匹配的字符串设置为list1中的字符串,要匹配的字符串列表设置为list2,其他参数一样,相当于说我先用表格1去匹配表格2,再用表格2去匹配表格1,这样就能够较好地解决遗漏的问题。
3.5
最后设置好新的excel表格的参数
workbook=xlwt.Workbook(encoding='utf-8')#设定好新的excel表格的参数
worksheet=workbook.add_sheet('test_sheet')
worksheet.write(0,0,label='XXX改造')#从第0行第0列开始输入标签为XXX改造的数据
worksheet.write(0,1,label='XX金额')#从第0行第1列开始输入标签为XX金额的数据
worksheet.write(0,2,label='XXX新改')
worksheet.write(0,3,label='XX金额')
worksheet.write(0,4,label='已XXX金额')
for i in range(len(listx)):#写入运算出来的数据
worksheet.write(i+1,0,label=listx[i])
for j in range(len(listy)):
worksheet.write(j+1,2,label=listy[j])
for k in range(len(list1)):
worksheet.write(k+1,1,label=list3[k])
for l in range(len(list2)):
worksheet.write(l+1,3,label=list4[l])
worksheet.write(l+1,4,label=list5[l])
workbook.save(r'D:\杂货\新项目6.xls')#导出excel表格
这里使用的向excel表格中写入数据内容的方法就不过多介绍,对于有一定处理excel经验的人能够很容易理解代码的含义。
最后输出的表格形式如下:
通过两遍匹配,两者相互匹配度都高的则会出对应地出现在表格中,而只有单一匹配度高的,则出现了左边有数据右边没有数据,或者右边有数据左边没有数据的情况。
四、代码集合
import pandas as pd
import difflib
import xlwt#导入库
df1=pd.read_excel(r'D:\杂货\项目.xlsx',sheet_name='Sheet1')
df2=pd.read_excel(r'D:\杂货\项目2.xlsx',sheet_name='Sheet1')#导入两个需要处理的excel表格
list1=[]#设置空列表,用于存储2017年一列的数据
list2=[]#用于存储2018年一列的数据
list3=list(df1['XX金额'])#将excel表格中的列数据列表化
list4=list(df2['XX金额'])
list5=list(df2['XXX金额'])
listx=[]#用于存储匹配结果的数据
listy=[]#同上
for i in df1['XXXXXXXXX改造']:#将这两列的数据存入list1和list2两个列表中
list1.append(i)
for j in df2['XXXXXXXXXXXXX新改']:
list2.append(j)
for n in range(len(list2)):#通过模糊匹配算法,将list2与list1中的数据一一匹配,设置近似度为42%,得到匹配结果res
query_word=str(list2[n])
res=difflib.get_close_matches(query_word,list1,1,cutoff=0.42)
res = "".join(res)
listx.append(res)
for m in range(len(list1)):#同上,将list1与list2的数据一一匹配
query_word=str(list1[m])
res=difflib.get_close_matches(query_word,list2,1,cutoff=0.42)
res="".join(res)
listy.append(res)
workbook=xlwt.Workbook(encoding='utf-8')#设定好新的excel表格的参数
worksheet=workbook.add_sheet('test_sheet')
worksheet.write(0,0,label='XXXXXXXXX改造')
worksheet.write(0,1,label='XX金额')
worksheet.write(0,2,label='XXXXXXXXXXX新改')
worksheet.write(0,3,label='XX金额')
worksheet.write(0,4,label='XXX金额')
for i in range(len(listx)):#写入运算出来的数据
worksheet.write(i+1,0,label=listx[i])
for j in range(len(listy)):
worksheet.write(j+1,2,label=listy[j])
for k in range(len(list1)):
worksheet.write(k+1,1,label=list3[k])
for l in range(len(list2)):
worksheet.write(l+1,3,label=list4[l])
worksheet.write(l+1,4,label=list5[l])
workbook.save(r'D:\杂货\新项目6.xls')#导出excel表格
五、总结
本篇的重点在于使用了模糊匹配的算法,并且介绍该算法的使用才是本篇的目的。其他的内容则是用于辅助介绍该算法。
来源:https://blog.csdn.net/Deng333333555/article/details/126332008


猜你喜欢
- 呃,看到这个标题,我们可以首先将IE系浏览器无视了。我承认,我是有极简主义倾向的,我希望能够使用最少的代码和图片做更多的事情。虽然CSS3仅
- 前言总所周知,go 里面只有两种 channel,一种是 unbuffered channel, 其声明方式为ch := make(chan
- 递归查询对于同一个表父子关系的计算提供了很大的方便,这个示例使用了SQL server 2005中的递归查询,使用的表是CarParts,这
- 本文实例讲述了JS实现合并json对象的方法。分享给大家供大家参考,具体如下:一、问题:求json对象合并的方法var a ={"
- Python操作Mysql最近在学习python,这种脚本语言毫无疑问的会跟数据库产生关联,因此这里介绍一下如何使用python操作mysq
- 如何在ADO服务器端利用好缓存技术?请看下面示例,这是一个用来显示图书分类的例子程序:displayBooks.asp< %
- Python脚本有一个毛病,当使用相对路径时,被另一个不同目录下的py文件中导入时,会报找不到对应文件的问题。感觉是当前工作目录变成了导入p
- 接口(python 中的协议)的多种不同的实现方式即为多态。多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属
- 本文实例讲述了PHP获取指定日期是星期几的实现方法。分享给大家供大家参考,具体如下:<?php header("
- 这章是结合之前学习的Tensforboard与Transforms的一个练习。直接上代码:from PIL import Imagefrom
- 1. 序列__getitem__如果没有 __iter__ 和 __contains__ 方法,Python 会调用 __getitem__
- 本文以实例演示5种验证码,并介绍生成验证码的函数。PHP生成验证码的原理:通过GD库,生成一张带验证码的图片,并将验证码保存在Session
- 首先我们来看一下属性的定义属性的定义:python中的属性其实是普通方法的衍生。操作类属性有三种方法:1.使用@property装饰器操作类
- Agent 服务启动后又停止本地计算机上的SQL Server Agent 服务启动后又停止了,一些服务自动停止,如果它们没有什么可做的例如
- 1、面向对象【三大显著特征】: 封装、继承、多态1、封装【解释】: 封装的本质就是将有关联的代码组合在一起。【优势】:保
- 本文实例讲述了python网络编程之数据传输UDP实现方法。分享给大家供大家参考。具体分析如下:一、问题:你觉得网络上像msn,qq之类的工
- 1. 模型1.1. 模型定义type User struct { gorm.Model
- 一、登录以信号与系统课程为例,直接输入网址则出现登录界面:由于学号登录需要验证码,因此选择电话登录:直接在开发者工具中找到手机号输入框、密码
- 这里针对smtplib做了一系列封装,可以完成以下四种场景:发送纯文本的邮件发送html页面的邮件发送带附件文件的邮件发送能展示图片的邮件以
- 一、如何新建独立帐号并设置权限这里我使用Navicat作为我的数据库管理工具,打开Navicat。选择“用户”--“新建用户”输入用户名、主