日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python利用pandas合并excel表格代码_利用Python pandas对Excel进行合并的方法示例

發(fā)布時(shí)間:2025/3/12 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python利用pandas合并excel表格代码_利用Python pandas对Excel进行合并的方法示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

在網(wǎng)上找了很多Python處理Excel的方法和代碼,都不是很盡人意,所以自己綜合網(wǎng)上各位大佬的方法,自己進(jìn)行了優(yōu)化,具體的代碼如下。

博主也是新手一枚,代碼肯定有很多需要優(yōu)化的地方,歡迎各位大佬提出建議~

代碼我自己已經(jīng)用了一段時(shí)間,可以直接拿去用

主要功能

按行合并 ,即保留固定的表頭(如前幾行),實(shí)現(xiàn)多個(gè)Excel相同格式相同名字的表單按縱軸合并;

按列合并。 即保留固定的首列,實(shí)現(xiàn)多個(gè)Excel相同格式相同名字的表單按橫軸合并;

表單集成 ,實(shí)現(xiàn)不同Excel中相同sheet的集成(即不匯總,僅集成到同一個(gè)新的Excel中)。此處的代碼稍微改一下即可實(shí)現(xiàn)不同Excel中所有sheet的集成;

自動(dòng)檢測(cè)所需合并的sheet名稱是否出現(xiàn)在所有的目標(biāo)文件中,如果不是則予以提示 ;

sheet選擇、表頭選擇、功能選擇界面實(shí)現(xiàn)可視化;

合并后進(jìn)行簡(jiǎn)單的缺省值處理、格式處理

解決MacOS系統(tǒng)下文件目錄中出現(xiàn).DS_Store隱藏文件導(dǎo)致程序出錯(cuò)的bug。

用到的庫(kù)

pandas 、tkinter 、 pathlib、os 、 xlrd

代碼

import pandas as pd

import tkinter as tk

from tkinter import filedialog

import pathlib

import os

import xlrd

# 選擇文件夾對(duì)話框,窗口交互,打開選擇窗口

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): # 因?yàn)槿コ氖?XSLX,5個(gè)字符,可以根據(jù)實(shí)際需要修改

n1.pop() # 依次刪除最后一個(gè)元素

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)路徑下特定文件名的列表

# 建立一個(gè)交互窗口

windows = tk.Tk()

windows.title('請(qǐng)?zhí)峁┤缦滦畔?#39;) # 設(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為長(zhǎng),height為高,這里的長(zhǎng)和高是字符的長(zhǎng)和高,比如height=2,就是標(biāo)簽有2個(gè)字符這么高)

tk.Label(windows, text='請(qǐng)輸入想要合并的sheet名稱:').grid(row=0, column=0) # label用來顯示不可編輯的文本和圖標(biāo)(提示性文字)

tk.Label(windows, text='請(qǐng)輸入想要確定的表頭行數(shù):').grid(row=1, column=0)

tk.Label(windows, text='請(qǐng)輸入您想實(shí)現(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個(gè)輸入框

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='點(diǎn)擊繼續(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)自動(dò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]) # 讀取獲取到的第一個(gè)文件名對(duì)應(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ù)是參與連接的對(duì)象的列表或字典。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]) # 讀取獲取到的第一個(gè)文件名對(duì)應(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ù)是參與連接的對(duì)象的列表或字典。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的一個(gè)方法,可以實(shí)現(xiàn)數(shù)據(jù)儲(chǔ)存是要保存的名字

writerExcel = pd.ExcelWriter(fname+'.xlsx') # 寫入到一個(gè)新的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ù)庫(kù)記住刪除的單元格

# mergedata1.dropna(axis='columns', how='all') # 刪除全是缺失值的列

mergedata1.fillna('0') # 將所有缺失值填充為0

mergedata1.to_excel(writerExcel, sheet_name=name, index=False) # 新建一個(gè)sheet儲(chǔ)存信息

i = i + 1

if choice != 3:

# 數(shù)據(jù)清理

mergedata1.dropna(thresh=4, inplace=True) # 必須使用inplace才可以使數(shù)據(jù)庫(kù)記住刪除的單元格

mergedata1.dropna(axis='columns', how='all') # 刪除全是缺失值的列

mergedata1.fillna('0') # 將所有缺失值填充為0

# 保存至excel

fname = tk.filedialog.asksaveasfilename(title=u'保存文件',

filetypes=[("excel", ".xlsx")]) # fideialog的一個(gè)方法,可以實(shí)現(xiàn)數(shù)據(jù)儲(chǔ)存是要保存的名字

writerExcel = pd.ExcelWriter(fname + '.xlsx') # 寫入到一個(gè)新的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的格式,對(duì)于數(shù)字內(nèi)容,每三位進(jìn)行一個(gè)分隔符,并且保留兩位小數(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對(duì)Excel進(jìn)行合并的文章就介紹到這了,更多相關(guān)Python pandas對(duì)Excel合并內(nèi)容請(qǐng)搜索隨便開發(fā)網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持隨便開發(fā)網(wǎng)!

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的python利用pandas合并excel表格代码_利用Python pandas对Excel进行合并的方法示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。