利用Python pandas對Excel進(jìn)行合并的方法示例
前言
在網(wǎng)上找了很多Python處理Excel的方法和代碼,都不是很盡人意,所以自己綜合網(wǎng)上各位大佬的方法,自己進(jìn)行了優(yōu)化,具體的代碼如下。
博主也是新手一枚,代碼肯定有很多需要優(yōu)化的地方,歡迎各位大佬提出建議~
代碼我自己已經(jīng)用了一段時間,可以直接拿去用
主要功能
- 按行合并 ,即保留固定的表頭(如前幾行),實現(xiàn)多個Excel相同格式相同名字的表單按縱軸合并;
- 按列合并。 即保留固定的首列,實現(xiàn)多個Excel相同格式相同名字的表單按橫軸合并;
- 表單集成 ,實現(xiàn)不同Excel中相同sheet的集成(即不匯總,僅集成到同一個新的Excel中)。此處的代碼稍微改一下即可實現(xiàn)不同Excel中所有sheet的集成;
- 自動檢測所需合并的sheet名稱是否出現(xiàn)在所有的目標(biāo)文件中,如果不是則予以提示 ;
- sheet選擇、表頭選擇、功能選擇界面實現(xiàn)可視化;
- 合并后進(jìn)行簡單的缺省值處理、格式處理
- 解決MacOS系統(tǒng)下文件目錄中出現(xiàn).DS_Store隱藏文件導(dǎo)致程序出錯的bug。
用到的庫
pandas 、tkinter 、 pathlib、os 、 xlrd
代碼
import pandas as pd import tkinter as tk from tkinter import filedialog import pathlib import os import xlrd # 選擇文件夾對話框,窗口交互,打開選擇窗口 filedirectory = filedialog.askdirectory() p1 = pathlib.Path(filedirectory) # 該部分主要為了獲取目標(biāo)路徑下的文件名 print(p1) bookname1 = os.listdir(p1) # 返回目標(biāo)文件夾下的所有文件名 if ".DS_Store" in bookname1: bookname1.remove('.DS_Store') # 刪除文件名里的.xlsx bookname = [] for n in bookname1: n1 = list(n) # 把字符變成列表 for i in range(5): # 因為去除的是.XSLX,5個字符,可以根據(jù)實際需要修改 n1.pop() # 依次刪除最后一個元素 n2 = ''.join(n1) # 把列表變成字符 bookname.append(n2) excles = p1.rglob('*.xlsx') # 類似于os.work,能夠返回目標(biāo)路徑下的文件路徑,并且可以添加條件 excelarr = [] for eachexcel in excles: excelarr.append(eachexcel) # 創(chuàng)建目標(biāo)路徑下特定文件名的列表 # 建立一個交互窗口 windows = tk.Tk() windows.title('請?zhí)峁┤缦滦畔?) # 設(shè)置文本框的標(biāo)題 windows.geometry('1000x300') # 設(shè)置界面的大小 # tk.Label(windows, text='你好!this is Tkinter', bg='green', font=('Arial', 12), width=30, height=2) # 說明:bg為背景,font為字體,width為長,height為高,這里的長和高是字符的長和高,比如height=2,就是標(biāo)簽有2個字符這么高) tk.Label(windows, text='請輸入想要合并的sheet名稱:').grid(row=0, column=0) # label用來顯示不可編輯的文本和圖標(biāo)(提示性文字) tk.Label(windows, text='請輸入想要確定的表頭行數(shù):').grid(row=1, column=0) tk.Label(windows, text='請輸入您想實現(xiàn)的功能,1為按行合并sheet,2為按列合并sheet,3為sheet匯總:').grid(row=2, column=0) # Listbox(dict={}) # 創(chuàng)建可選下拉框 e1 = tk.Entry(windows) # 創(chuàng)建輸入框 e2 = tk.Entry(windows) # 創(chuàng)建第2個輸入框 e3 = tk.Entry(windows) e1.grid(row=0, column=1, padx=10, pady=5) e2.grid(row=1, column=1, padx=10, pady=5) e3.grid(row=2, column=1, padx=10, pady=5) tk.Button(windows, text='點擊繼續(xù)', width=10, command=windows.quit) \ .grid(row=4, column=1, sticky=tk.E, padx=10, pady=5) # sticky表示方位,NSWE為上下左右 tk.mainloop() # 結(jié)束循環(huán) # 為變量賦值 word = str(e1.get()) number = int(e2.get()) - 1 choice = int(e3.get()) # 檢查想要處理的sheet是否在所有的目標(biāo)文件中 file_list = os.listdir(p1) file_list.remove('.DS_Store') # 移除Mac系統(tǒng)自動生成的文件 for file in file_list: # 循環(huán)遍歷列出所有文件名稱 file_name = os.path.join(p1, file) # 因os.listdir工具返回的是目標(biāo)文件夾里文件的名字,然而打開文件需要文件路徑+名字,故通過此工具獲取完整的文件名 workbook = xlrd.open_workbook(file_name) # 打開遍歷的文件 if word in workbook.sheet_names(): continue else: print(str(file) + '中不存在想要合并的sheet') if choice == 2: p1 = pd.ExcelFile(excelarr[0]) # 讀取獲取到的第一個文件名對應(yīng)的文件 mergedata1 = p1.parse(header=number, sheet_name=word).iloc[:, 0] # 設(shè)置索引為第一行,如果為index_col,則索引為第一列 iloc為取特定的列 p2 = [] for i in range(0, len(excelarr)): tmp = pd.ExcelFile(excelarr[i]) # 讀取文件 currentdata = tmp.parse(header=number, sheet_name=word).iloc[:, [1, 2, 3, 4]] # 讀取特定的列 mergedata1 = pd.concat([mergedata1, currentdata], axis=1) # concat連接函數(shù),唯一必須的參數(shù)是參與連接的對象的列表或字典。axis=1,表示可以按照縱軸來合并 n = currentdata.shape[1] # 返回Dataframe的行數(shù),1為返回列數(shù) p2.append(n) # 獲取讀取文件的行數(shù)列表 name_list = [] i = 0 # 獲取應(yīng)插入的文件名的列表 for a1 in bookname: for x in range(p2[i]): name_list.append(a1) i = i + 1 name_list.insert(0, '來自表格') mergedata1.loc[-1] = name_list # 按行插入 if choice == 1: p1 = pd.ExcelFile(excelarr[0]) # 讀取獲取到的第一個文件名對應(yīng)的文件 mergedata1 = p1.parse(header=number, sheet_name=word) # 設(shè)置索引為第一行,如果為index_col,則索引為第一列 p2 = [] p2.append(mergedata1.shape[0]) for i in range(1, len(excelarr)): tmp = pd.ExcelFile(excelarr[i]) # 讀取文件 currentdata = tmp.parse(header=number, sheet_name=word) # 讀取特定的表 mergedata1 = pd.concat([mergedata1, currentdata]) # concat連接函數(shù),唯一必須的參數(shù)是參與連接的對象的列表或字典。axis=1,表示可以按照縱軸來合并 n = currentdata.shape[0] # 返回Dataframe的行數(shù),1為返回列數(shù) p2.append(n) # 獲取讀取文件的行數(shù)列表 name_list = [] i = 0 # 獲取應(yīng)插入的文件名的列表 for a1 in bookname: for x in range(p2[i]): name_list.append(a1) i = i + 1 mergedata1.insert(0, '來自表格', name_list) # 插入第一列,作為表格數(shù)據(jù)來源的注釋 if choice == 3: i = 0 fname = tk.filedialog.asksaveasfilename(title=u'保存文件', filetypes=[("excel", ".xlsx")]) # fideialog的一個方法,可以實現(xiàn)數(shù)據(jù)儲存是要保存的名字 writerExcel = pd.ExcelWriter(fname+'.xlsx') # 寫入到一個新的Excel,并且命名為上一步驟確認(rèn)的名字 for name in bookname: p1 = pd.ExcelFile(excelarr[i]) mergedata1 = p1.parse(header=number, sheet_name=word) # 設(shè)置索引為第一行,如果為index_col,則索引為第一列 # mergedata1.dropna(thresh=4, inplace=True) # 必須使用inplace才可以使數(shù)據(jù)庫記住刪除的單元格 # mergedata1.dropna(axis='columns', how='all') # 刪除全是缺失值的列 mergedata1.fillna('0') # 將所有缺失值填充為0 mergedata1.to_excel(writerExcel, sheet_name=name, index=False) # 新建一個sheet儲存信息 i = i + 1 if choice != 3: # 數(shù)據(jù)清理 mergedata1.dropna(thresh=4, inplace=True) # 必須使用inplace才可以使數(shù)據(jù)庫記住刪除的單元格 mergedata1.dropna(axis='columns', how='all') # 刪除全是缺失值的列 mergedata1.fillna('0') # 將所有缺失值填充為0 # 保存至excel fname = tk.filedialog.asksaveasfilename(title=u'保存文件', filetypes=[("excel", ".xlsx")]) # fideialog的一個方法,可以實現(xiàn)數(shù)據(jù)儲存是要保存的名字 writerExcel = pd.ExcelWriter(fname + '.xlsx') # 寫入到一個新的Excel,并且命名為上一步驟確認(rèn)的名字 mergedata1.to_excel(writerExcel, sheet_name='匯總表', index=False) # 將之前匯總的farmdate數(shù)據(jù)通過to excel寫入到Excel中 # 設(shè)置格式 sheetname = writerExcel.sheets workbook = writerExcel.book for sheets in sheetname: worksheet = writerExcel.sheets[sheets] format1 = workbook.add_format({'num_format': '###,##0.00', }) # 通過xlsxwriter模塊命名format1的格式,對于數(shù)字內(nèi)容,每三位進(jìn)行一個分隔符,并且保留兩位小數(shù)。#.00%為保留兩位小數(shù)的百分?jǐn)?shù).border為邊框。最后為文本換行和居中 # format2 = workbook.add_format({'bold': True, 'italic': True}) # 加粗、斜體 worksheet.set_column('A:ZZ', 16, format1) # 將上述定義的格式應(yīng)用到具體的單元格 # worksheet.set_row(0, 16, format2) # 將特定格式用于表頭 writerExcel.save() # 保存Excel print('success')
總結(jié)
到此這篇關(guān)于利用Python pandas對Excel進(jìn)行合并的文章就介紹到這了,更多相關(guān)Python pandas對Excel合并內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)復(fù)制圖片到指定文件夾并按順序重新命名
這篇文章主要為大家詳細(xì)介紹了如何利用Python實現(xiàn)將360個文件夾里的照片,全部復(fù)制到指定的文件夾中,并且按照順序重新命名,感興趣的小伙伴可以了解一下2023-03-03Python multiprocess pool模塊報錯pickling error問題解決方法分析
這篇文章主要介紹了Python multiprocess pool模塊報錯pickling error問題解決方法,結(jié)合實例形式分析了multiprocess pool模塊報錯pickling error的原因與解決方法,需要的朋友可以參考下2019-03-03Python實現(xiàn)根據(jù)指定端口探測服務(wù)器/模塊部署的方法
這篇文章主要介紹了Python根據(jù)指定端口探測服務(wù)器/模塊部署的方法,非常具有實用價值,需要的朋友可以參考下2014-08-08詳解Python如何輕松實現(xiàn)定時執(zhí)行任務(wù)
這篇文章主要為大家詳細(xì)介紹了Python如何在Windows下不用任務(wù)管理器就實現(xiàn)輕松定時執(zhí)行任務(wù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-10-10python使用paramiko模塊實現(xiàn)ssh遠(yuǎn)程登陸上傳文件并執(zhí)行
使用paramiko,ssh遠(yuǎn)程登陸,長傳文件并執(zhí)行。其中用到了多線程和隊列,paramiko是用python語言寫的一個模塊,遵循SSH2協(xié)議,支持以加密和認(rèn)證的方式,進(jìn)行遠(yuǎn)程服務(wù)器的連接。2014-01-01Python3實現(xiàn)轉(zhuǎn)換Image圖片格式
本篇文章給大家分享了Python3實現(xiàn)在線轉(zhuǎn)換Image圖片格式的功能以及相關(guān)實例代碼,有興趣的朋友參考下。2018-06-06