通過python模糊匹配算法對兩個excel表格內(nèi)容歸類
一、問題描述
在實習(xí)的時候,需要將兩個表格的內(nèi)容進(jìn)行匹配分類,比如兩個不同的工程項目針對的對象都是A,那么就需要將這兩個工程項目歸類到A當(dāng)中,而這當(dāng)中的工程項目和施工對象數(shù)量都還挺多的,因此想著寫個程序來自動將它們歸類起來,這樣可以減少很大一部分的工作量。
二、運(yùn)用方法
由于兩個表格中擁有相似的關(guān)鍵詞,即一個表格的內(nèi)容形式為為A工程項目,另一個表格的內(nèi)容形式為A單位,那么我就需要將其中的“A”這個關(guān)鍵詞相匹配就能夠篩選出來了。能夠達(dá)到目的的程序?qū)懛ㄓ胁簧?,而我在這次的問題中選擇了通過模糊匹配的算法來實現(xiàn)該功能。
三、代碼編寫
注:這里我們導(dǎo)入了difflib庫,用于使用模糊匹配算法;xlwt庫,用于導(dǎo)出excel表格
3.1
首先我們導(dǎo)入兩個需要處理的excel表格。
df1=pd.read_excel(r'D:\雜貨\項目.xlsx',sheet_name='Sheet1') df2=pd.read_excel(r'D:\雜貨\項目2.xlsx',sheet_name='Sheet1')#導(dǎo)入兩個需要處理的excel表格
兩個表格的內(nèi)容形式大致如上。而我的需求是將這兩個表格相關(guān)的工程項目匹配歸類。
導(dǎo)入方法不再贅述,詳見:
如何在Python中導(dǎo)入EXCEL數(shù)據(jù)
3.2
再將我們所要處理的兩列數(shù)據(jù)放入一個列表當(dāng)中。
for i in df1['XXXXXX改造']:#將這兩列的數(shù)據(jù)存入list1和list2兩個列表中 list1.append(i) for j in df2['XXXXXX新改']: list2.append(j)
3.3
通過模糊匹配算法,將list2中的數(shù)據(jù)內(nèi)容與list1中的數(shù)據(jù)內(nèi)容一一匹配。
for n in range(len(list2)):#通過模糊匹配算法,將list2與list1中的數(shù)據(jù)一一匹配,設(shè)置近似度為42%,得到匹配結(jié)果res query_word=str(list2[n]) res=difflib.get_close_matches(query_word,list1,1,cutoff=0.42) res = "".join(res) listx.append(res)
需要注意的是,該處調(diào)用了difflib庫中的get_close_matches(query_word,list1,n,cutoff)方法,其中的query_word為被匹配的字符串;list1為要匹配的字符串列表;n為前topn個最佳匹配反回,我將其設(shè)置為1;cutoff為匹配度大小,為[0,1]的浮點(diǎn)數(shù),也可以稱為兩者的相似程度,這個就看個人需求和具體問題來設(shè)置,我將其相似程度設(shè)置為0.42則恰好能夠?qū)⑽宜枰ヅ涞膬蓚€表格的內(nèi)容都匹配成功。
由于res匹配出來的每一個結(jié)果都是是列表的形式,而我們想要將結(jié)果寫入新的表格當(dāng)中需要字符串形式的結(jié)果,因此使用res=””.join(res)方法將列表轉(zhuǎn)換為字符串的形式,然后將字符串形式的結(jié)果放入listx列表當(dāng)中,以便于寫入新的excel表格。
3.4
由于擔(dān)心會存在匹配結(jié)果遺漏的情況出現(xiàn),因此我又將list1中的數(shù)據(jù)內(nèi)容與list2中的數(shù)據(jù)內(nèi)容一一匹配。
for m in range(len(list1)):#同上,將list1與list2的數(shù)據(jù)一一匹配 query_word=str(list1[m]) res=difflib.get_close_matches(query_word,list2,1,cutoff=0.42) res="".join(res) listy.append(res)
這時我將被匹配的字符串設(shè)置為list1中的字符串,要匹配的字符串列表設(shè)置為list2,其他參數(shù)一樣,相當(dāng)于說我先用表格1去匹配表格2,再用表格2去匹配表格1,這樣就能夠較好地解決遺漏的問題。
3.5
最后設(shè)置好新的excel表格的參數(shù)
workbook=xlwt.Workbook(encoding='utf-8')#設(shè)定好新的excel表格的參數(shù) worksheet=workbook.add_sheet('test_sheet') worksheet.write(0,0,label='XXX改造')#從第0行第0列開始輸入標(biāo)簽為XXX改造的數(shù)據(jù) worksheet.write(0,1,label='XX金額')#從第0行第1列開始輸入標(biāo)簽為XX金額的數(shù)據(jù) worksheet.write(0,2,label='XXX新改') worksheet.write(0,3,label='XX金額') worksheet.write(0,4,label='已XXX金額') for i in range(len(listx)):#寫入運(yùn)算出來的數(shù)據(jù) 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')#導(dǎo)出excel表格
這里使用的向excel表格中寫入數(shù)據(jù)內(nèi)容的方法就不過多介紹,對于有一定處理excel經(jīng)驗的人能夠很容易理解代碼的含義。
最后輸出的表格形式如下:
通過兩遍匹配,兩者相互匹配度都高的則會出對應(yīng)地出現(xiàn)在表格中,而只有單一匹配度高的,則出現(xiàn)了左邊有數(shù)據(jù)右邊沒有數(shù)據(jù),或者右邊有數(shù)據(jù)左邊沒有數(shù)據(jù)的情況。
四、代碼集合
import pandas as pd import difflib import xlwt#導(dǎo)入庫 df1=pd.read_excel(r'D:\雜貨\項目.xlsx',sheet_name='Sheet1') df2=pd.read_excel(r'D:\雜貨\項目2.xlsx',sheet_name='Sheet1')#導(dǎo)入兩個需要處理的excel表格 list1=[]#設(shè)置空列表,用于存儲2017年一列的數(shù)據(jù) list2=[]#用于存儲2018年一列的數(shù)據(jù) list3=list(df1['XX金額'])#將excel表格中的列數(shù)據(jù)列表化 list4=list(df2['XX金額']) list5=list(df2['XXX金額']) listx=[]#用于存儲匹配結(jié)果的數(shù)據(jù) listy=[]#同上 for i in df1['XXXXXXXXX改造']:#將這兩列的數(shù)據(jù)存入list1和list2兩個列表中 list1.append(i) for j in df2['XXXXXXXXXXXXX新改']: list2.append(j) for n in range(len(list2)):#通過模糊匹配算法,將list2與list1中的數(shù)據(jù)一一匹配,設(shè)置近似度為42%,得到匹配結(jié)果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的數(shù)據(jù)一一匹配 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')#設(shè)定好新的excel表格的參數(shù) 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)):#寫入運(yùn)算出來的數(shù)據(jù) 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')#導(dǎo)出excel表格
五、總結(jié)
本篇的重點(diǎn)在于使用了模糊匹配的算法,并且介紹該算法的使用才是本篇的目的。其他的內(nèi)容則是用于輔助介紹該算法。
到此這篇關(guān)于通過python模糊匹配算法對兩個excel表格內(nèi)容歸類的文章就介紹到這了,更多相關(guān)python模糊匹配算法excel表格歸類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python的Twisted框架編寫簡單的網(wǎng)絡(luò)客戶端
這篇文章主要介紹了使用Python的Twisted框架編寫簡單的網(wǎng)絡(luò)客戶端,翻譯自Twisted文檔,包括一個簡單的IRC客戶端的實現(xiàn),需要的朋友可以參考下2015-04-04python opencv旋轉(zhuǎn)圖像(保持圖像不被裁減)
這篇文章主要為大家詳細(xì)介紹了python opencv旋轉(zhuǎn)圖像,保持圖像不被裁減,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07Python實現(xiàn)保證只能運(yùn)行一個腳本實例
這篇文章主要介紹了Python實現(xiàn)保證只能運(yùn)行一個腳本實例,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-06-06python實現(xiàn)錄制全屏和選擇區(qū)域錄屏功能
這篇文章主要介紹了python實現(xiàn)錄制全屏和選擇區(qū)域錄屏功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02Python數(shù)組拼接np.concatenate實現(xiàn)過程
這篇文章主要介紹了Python數(shù)組拼接np.concatenate實現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04Pytorch實現(xiàn)ResNet網(wǎng)絡(luò)之Residual Block殘差塊
這篇文章主要為大家介紹了Pytorch實現(xiàn)ResNet網(wǎng)絡(luò)之Residual Block殘差塊實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04