python对数据进⾏合并的函数_利⽤Pythonpandas对Excel进
⾏合并的⽅法⽰例
前⾔
在⽹上了很多Python处理Excel的⽅法和代码,都不是很尽⼈意,所以⾃⼰综合⽹上各位⼤佬的⽅法,⾃⼰进⾏了优化,具体的代码如下。
博主也是新⼿⼀枚,代码肯定有很多需要优化的地⽅,欢迎各位⼤佬提出建议~
代码我⾃⼰已经⽤了⼀段时间,可以直接拿去⽤
主要功能
按⾏合并 ,即保留固定的表头(如前⼏⾏),实现多个Excel相同格式相同名字的表单按纵轴合并;
按列合并。 即保留固定的⾸列,实现多个Excel相同格式相同名字的表单按横轴合并;
表单集成 ,实现不同Excel中相同sheet的集成(即不汇总,仅集成到同⼀个新的Excel中)。此处的代码稍微改⼀下即可实现不同Excel中所有sheet的集成;
⾃动检测所需合并的sheet名称是否出现在所有的⽬标⽂件中,如果不是则予以提⽰ ;
sheet选择、表头选择、功能选择界⾯实现可视化;
合并后进⾏简单的缺省值处理、格式处理
解决MacOS系统下⽂件⽬录中出现.DS_Store隐藏⽂件导致程序出错的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) # 该部分主要为了获取⽬标路径下的⽂件名
print(p1)
bookname1 = os.listdir(p1) # 返回⽬标⽂件夹下的所有⽂件名
if ".DS_Store" in bookname1:
# 删除⽂件名⾥的.xlsx
bookname = []
for n in bookname1:
n1 = list(n) # 把字符变成列表
for i in range(5): # 因为去除的是.XSLX,5个字符,可以根据实际需要修改
n1.pop() # 依次删除最后⼀个元素
n2 = ''.join(n1) # 把列表变成字符
bookname.append(n2)
excles = p1.rglob('*.xlsx') # 类似于os.work,能够返回⽬标路径下的⽂件路径,并且可以添加条件
excelarr = []
for eachexcel in excles:
excelarr.append(eachexcel) # 创建⽬标路径下特定⽂件名的列表
# 建⽴⼀个交互窗⼝
windows = tk.Tk()
windows.title('请提供如下信息') # 设置⽂本框的标题
# tk.Label(windows, text='你好!this is Tkinter', bg='green', font=('Arial', 12), width=30, height=2)
# 说明:bg为背景,font为字体,width为长,height为⾼,这⾥的长和⾼是字符的长和⾼,⽐如height=2,就是标签有2个字符这么⾼) tk.Label(windows, text='请输⼊想要合并的sheet名称:').grid(row=0, column=0) # label⽤来显⽰不可编辑的⽂本和图标(提⽰性⽂字) tk.Label(windows, text='请输⼊想要确定的表头⾏数:').grid(row=1, column=0)
tk.Label(windows, text='请输⼊您想实现的功能,1为按⾏合并sheet,2为按列合并sheet,3为sheet汇总:').grid(row=2, column=0) # Listbox(dict={}) # 创建可选下拉框
e1 = tk.Entry(windows) # 创建输⼊框
e2 = tk.Entry(windows) # 创建第2个输⼊框
e3 = tk.Entry(windows)
tk.Button(windows, text='点击继续', width=10, command=windows.quit) \
.grid(row=4, column=1, sticky=tk.E, padx=10, pady=5) # sticky表⽰⽅位,NSWE为上下左右
python新手代码你好tk.mainloop() # 结束循环
# 为变量赋值
word = ())
number = ()) - 1
choice = ())
# 检查想要处理的sheet是否在所有的⽬标⽂件中
file_list = os.listdir(p1)
ve('.DS_Store') # 移除Mac系统⾃动⽣成的⽂件
for file in file_list: # 循环遍历列出所有⽂件名称
file_name = os.path.join(p1, file) # 因os.listdir⼯具返回的是⽬标⽂件夹⾥⽂件的名字,然⽽打开⽂件需要⽂件路径+名字,故通过此⼯具获取完整的⽂件名
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]) # 读取获取到的第⼀个⽂件名对应的⽂件
mergedata1 = p1.parse(header=number, sheet_name=word).iloc[:, 0] # 设置索引为第⼀⾏,如果为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连接函数,唯⼀必须的参数是参与连接的对象的列表或字典。axis=1,表⽰可以按照纵轴来合并
n = currentdata.shape[1] # 返回Dataframe的⾏数,1为返回列数
p2.append(n) # 获取读取⽂件的⾏数列表
name_list = []
i = 0
# 获取应插⼊的⽂件名的列表
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]) # 读取获取到的第⼀个⽂件名对应的⽂件
mergedata1 = p1.parse(header=number, sheet_name=word) # 设置索引为第⼀⾏,如果为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连接函数,唯⼀必须的参数是参与连接的对象的列表或字典。axis=1,表⽰可以按照纵轴来合并
n = currentdata.shape[0] # 返回Dataframe的⾏数,1为返回列数
p2.append(n) # 获取读取⽂件的⾏数列表
name_list = []
i = 0
# 获取应插⼊的⽂件名的列表
for a1 in bookname:
for x in range(p2[i]):
name_list.append(a1)
i = i + 1
mergedata1.insert(0, '来⾃表格', name_list) # 插⼊第⼀列,作为表格数据来源的注释
if choice == 3:
i = 0
fname = tk.filedialog.asksaveasfilename(title=u'保存⽂件', filetypes=[("excel", ".xlsx")])
# fideialog的⼀个⽅法,可以实现数据储存是要保存的名字
writerExcel = pd.ExcelWriter(fname+'.xlsx') # 写⼊到⼀个新的Excel,并且命名为上⼀步骤确认的名字
for name in bookname:
p1 = pd.ExcelFile(excelarr[i])
mergedata1 = p1.parse(header=number, sheet_name=word) # 设置索引为第⼀⾏,如果为index_col,则索引为第⼀列
# mergedata1.dropna(thresh=4, inplace=True) # 必须使⽤inplace才可以使数据库记住删除的单元格
# mergedata1.dropna(axis='columns', how='all') # 删除全是缺失值的列
mergedata1.fillna('0') # 将所有缺失值填充为0
<_excel(writerExcel, sheet_name=name, index=False) # 新建⼀个sheet储存信息
i = i + 1
if choice != 3:
# 数据清理
mergedata1.dropna(thresh=4, inplace=True) # 必须使⽤inplace才可以使数据库记住删除的单元格
mergedata1.dropna(axis='columns', how='all') # 删除全是缺失值的列
mergedata1.fillna('0') # 将所有缺失值填充为0
# 保存⾄excel
fname = tk.filedialog.asksaveasfilename(title=u'保存⽂件',
filetypes=[("excel", ".xlsx")]) # fideialog的⼀个⽅法,可以实现数据储存是要保存的名字
writerExcel = pd.ExcelWriter(fname + '.xlsx') # 写⼊到⼀个新的Excel,并且命名为上⼀步骤确认的名字
<_excel(writerExcel, sheet_name='汇总表', index=False) # 将之前汇总的farmdate数据通过to excel写⼊到Excel中
# 设置格式
sheetname = writerExcel.sheets
workbook = writerExcel.book
for sheets in sheetname:
worksheet = writerExcel.sheets[sheets]
format1 = workbook.add_format({'num_format': '###,##0.00', })
# 通过xlsxwriter模块命名format1的格式,对于数字内容,每三位进⾏⼀个分隔符,并且保留两位⼩数。#.00%为保留两位⼩数的百分数.border为边框。最后为⽂本换⾏和居中
# format2 = workbook.add_format({'bold': True, 'italic': True}) # 加粗、斜体
worksheet.set_column('A:ZZ', 16, format1) # 将上述定义的格式应⽤到具体的单元格
# worksheet.set_row(0, 16, format2) # 将特定格式⽤于表头
writerExcel.save() # 保存Excel
print('success')
总结
到此这篇关于利⽤Python pandas对Excel进⾏合并的⽂章就介绍到这了,更多相关Python pandas对Excel合并内容请搜索python博客以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持python博客!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论