如何用Python实现Excel表格内容的模糊匹配归类?

2026-04-13 11:391阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1589个文字,预计阅读时间需要7分钟。

如何用Python实现Excel表格内容的模糊匹配归类?

问题描述:在实习期间,需要将两个表格的内容进行匹配分类,例如,将针对不同工程项目的对象都归类到A类中,那么就需要将这两个工程项目归入A当中间,而当前的工程项目和施工人员属于同一工程项目。

    一、问题描述

    在实习的时候,需要将两个表格的内容进行匹配分类,比如两个不同的工程项目针对的对象都是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表格

    两个表格的内容形式大致如上。而我的需求是将这两个表格相关的工程项目匹配归类。

    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表格的参数

    如何用Python实现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表格

    本文共计1589个文字,预计阅读时间需要7分钟。

    如何用Python实现Excel表格内容的模糊匹配归类?

    问题描述:在实习期间,需要将两个表格的内容进行匹配分类,例如,将针对不同工程项目的对象都归类到A类中,那么就需要将这两个工程项目归入A当中间,而当前的工程项目和施工人员属于同一工程项目。

      一、问题描述

      在实习的时候,需要将两个表格的内容进行匹配分类,比如两个不同的工程项目针对的对象都是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表格

      两个表格的内容形式大致如上。而我的需求是将这两个表格相关的工程项目匹配归类。

      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表格的参数

      如何用Python实现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表格