首頁  >  文章  >  後端開發  >  怎麼透過python模糊匹配演算法對兩個excel表格內容歸類

怎麼透過python模糊匹配演算法對兩個excel表格內容歸類

王林
王林轉載
2023-05-28 08:43:111520瀏覽

    一、問題描述

    在實習的時候,需要將兩個表格的內容進行配對分類,例如兩個不同的工程項目所針對的物件都是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經驗的人能夠很容易理解程式碼的意思。

    最後輸出的表格形式如下:

    怎麼透過python模糊匹配演算法對兩個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模糊匹配演算法對兩個excel表格內容歸類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除