怎么通过python模糊匹配算法对两个excel表格内容归类

    一、问题描述

    在实习的时候,需要将两个表格的内容进行匹配分类,比如两个不同的工程项目针对的对象都是A,那么就需要将这两个工程项目归类到A当中,而这当中的工程项目和施工对象数量都还挺多的,因此想着写个程序来自动将它们归类起来,这样可以减少很大一部分的工作量。

    二、运用方法

    由于两个表格中拥有相似的关键词,即一个表格的内容形式为为A工程项目,另一个表格的内容形式为A单位,那么我就需要将其中的“A”这个关键词相匹配就能够筛选出来了。在此问题中,我采用了模糊匹配算法来实现目标,而这个算法并非唯一的可行方案。

    三、代码编写

    注:这里我们导入了difflib库,用于使用模糊匹配算法;xlwt库,用于导出excel表格

    3.1

    用Python实现模糊匹配算法,智能归类两个Excel表格

    首先我们导入两个需要处理的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表格的参数

    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表格

    Python作为一种强大的编程语言,拥有丰富的算法库和数据处理能力,能够为各个行业提供高效的解决方案。在数据整合和分类方面,我们可以使用Python提供的模糊匹配算法,将两个Excel表格的内容智能归类,实现快速高效的数据处理。
    一、准备工作
    使用Python处理数据,首先需要安装相应的库文件,例如Python自带的re库、pandas库、numpy库等等。并且需要安装xlrd库和openpyxl库,xlrd库用于读取Excel文件,openpyxl库用于写入Excel文件。以下是安装命令:
    pip install pandas
    pip install numpy
    pip install xlrd
    pip install openpyxl
    二、读取Excel数据
    我们需要读取两个Excel表格中的数据,使用pandas库提供的函数可以很方便地读取Excel数据。使用该库中的read_excel函数可以读取指定Excel文件,并将数据存放到DataFrame中。
    三、使用模糊匹配算法
    模糊匹配算法的原理在于寻找两个字符串之间的相似性,从而判断它们是否可以匹配。常用的模糊匹配算法有Levenshtein Distance、Jaccard Similarity、TF-IDF等。我们选择基于TF-IDF算法的文本相似度匹配,通过计算Excel表格中字符串的相似程度,实现归类的目的。
    四、数据清洗
    在进行模糊匹配之前,我们需要进行数据清洗,对于Excel表格中的字符串进行处理,去掉多余的符号和空格。使用Python自带的re库可以很方便地实现该功能。
    五、实现数据归类
    通过对两个Excel表格中的字符串进行相似度计算,我们可以将相似的字符串归类到一起。我们可以使用pandas库提供的groupby函数,对于相似的字符串进行分组,这样就实现了Excel表格数据的智能归类。
    六、输出结果
    在完成数据归类之后,我们需要将结果重新写入到Excel表格中,供后续使用。使用openpyxl库提供的函数可以将DataFrame中的数据导出到指定的Excel表格中,并保存该文件。这样,我们就可以在数据处理后,得到一个更新的、更具有分类性的Excel表格了。
    七、总结
    本篇文章根据实际应用场景,讲述了如何使用Python中的模糊匹配算法实现Excel表格数据的智能归类。通过数据清洗和相似度计算,我们可以将Excel表格中相似的字符串归类到一起,使得数据更加信息化和可统计化。在实际应用中,我们可以根据具体需求进行修改和扩展,构建更加智能化的数据处理流程。