Semasa latihan, adalah perlu untuk memadankan dan mengklasifikasikan kandungan kedua-dua jadual, seperti untuk dua projek kejuruteraan yang berbeza Objeknya semuanya A, maka kedua-dua projek kejuruteraan ini perlu dikelaskan kepada A. Terdapat banyak projek kejuruteraan dan objek pembinaan di antaranya, jadi saya terfikir untuk menulis program untuk mengklasifikasikannya secara automatik Ini boleh mengurangkan sebahagian besar daripada beban kerja.
Memandangkan kedua-dua jadual mempunyai kata kunci yang serupa, iaitu format kandungan satu jadual ialah Projek A, dan format kandungan jadual yang satu lagi ialah Unit A, maka Saya hanya perlu memadankan kata kunci "A" untuk menapisnya. Dalam masalah ini, saya menggunakan algoritma padanan kabur untuk mencapai matlamat saya, tetapi algoritma ini bukan satu-satunya penyelesaian yang mungkin.
Nota: Di sini kami telah mengimport perpustakaan difflib untuk menggunakan algoritma pemadanan kabur untuk mengeksport jadual excel
Mula-mula kita mengimport dua jadual excel yang perlu diproses.
df1=pd.read_excel(r'D:\杂货\项目.xlsx',sheet_name='Sheet1') df2=pd.read_excel(r'D:\杂货\项目2.xlsx',sheet_name='Sheet1')#导入两个需要处理的excel表格
Kandungan dan format kedua-dua jadual adalah lebih kurang seperti di atas. Keperluan saya adalah untuk memadankan dan mengklasifikasikan projek kejuruteraan yang berkaitan dengan kedua-dua jadual ini.
Letakkan dua lajur data yang ingin kita proses ke dalam senarai.
for i in df1['XXXXXX改造']:#将这两列的数据存入list1和list2两个列表中 list1.append(i) for j in df2['XXXXXX新改']: list2.append(j)
Gunakan algoritma padanan kabur untuk memadankan kandungan data dalam senarai2 dengan kandungan data dalam senarai1 satu demi satu.
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)
Perlu diambil perhatian bahawa kaedah get_close_matches(query_word,list1,n,cutoff) dalam pustaka difflib dipanggil di sini, dengan query_word ialah rentetan yang hendak dipadankan; ; n ialah pulangan atas n padanan terbaik, saya menetapkannya kepada 1 ialah darjah padanan, yang merupakan nombor titik terapung dalam [0,1], yang juga boleh dipanggil darjah kesamaan antara kedua-duanya; . Ini bergantung pada keperluan peribadi Menurut tetapan masalah tertentu, saya menetapkan tahap persamaan kepada 0.42, yang boleh berjaya memadankan kandungan dua jadual yang saya perlu padankan.
Memandangkan setiap hasil yang dipadankan dengan res adalah dalam bentuk senarai, dan kami ingin menulis keputusan ke dalam jadual baharu, kami memerlukan keputusan dalam bentuk rentetan, jadi kami menggunakan res="".join( res ) menukar senarai ke dalam bentuk rentetan, dan kemudian meletakkan keputusan dalam bentuk rentetan ke dalam senarai listx untuk memudahkan penulisan ke jadual excel baharu.
Oleh kerana saya bimbang akan ada hasil padanan yang hilang, saya memadankan kandungan data dalam list1 dengan kandungan data dalam list2 satu demi satu.
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)
Pada masa ini, saya menetapkan rentetan yang dipadankan kepada rentetan dalam list1, dan senarai rentetan untuk dipadankan dengan senarai2. Parameter lain adalah sama, yang sama dengan mengatakan bahawa saya mula-mula menggunakan jadual 1 untuk memadankan jadual 2. , dan kemudian gunakan Jadual 2 untuk memadankan Jadual 1, supaya masalah yang hilang dapat diselesaikan dengan lebih baik.
Akhirnya tetapkan parameter jadual excel baharu
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表格
Kaedah yang digunakan di sini untuk menulis kandungan data ke dalam jadual excel tidak akan diperkenalkan secara terperinci mempunyai pengalaman bekerja dengan excel boleh memahami maksud kod dengan mudah.
Format jadual output akhir adalah seperti berikut:
Melalui padanan dua hala, mereka yang mempunyai tahap padanan bersama yang tinggi akan muncul dalam jadual dengan sewajarnya . , dan jika hanya terdapat satu tahap pemadanan yang tinggi, akan ada data di sebelah kiri tetapi tiada data di sebelah kanan, atau akan ada data di sebelah kanan tetapi tiada data di sebelah kiri.
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表格
Atas ialah kandungan terperinci Bagaimana untuk mengklasifikasikan kandungan dua jadual excel melalui algoritma pemadanan fuzzy python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!