利用Python pandas对Excel进行合并的方法示例


Posted in Python onNovember 04, 2020

前言

在网上找了很多Python处理Excel的方法和代码,都不是很尽人意,所以自己综合网上各位大佬的方法,自己进行了优化,具体的代码如下。

博主也是新手一枚,代码肯定有很多需要优化的地方,欢迎各位大佬提出建议~

代码我自己已经用了一段时间,可以直接拿去用

主要功能

  1. 按行合并 ,即保留固定的表头(如前几行),实现多个Excel相同格式相同名字的表单按纵轴合并;
  2. 按列合并。 即保留固定的首列,实现多个Excel相同格式相同名字的表单按横轴合并;
  3. 表单集成 ,实现不同Excel中相同sheet的集成(即不汇总,仅集成到同一个新的Excel中)。此处的代码稍微改一下即可实现不同Excel中所有sheet的集成;
  4. 自动检测所需合并的sheet名称是否出现在所有的目标文件中,如果不是则予以提示 ;
  5. sheet选择、表头选择、功能选择界面实现可视化;
  6. 合并后进行简单的缺省值处理、格式处理
  7. 解决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:
 bookname1.remove('.DS_Store')

# 删除文件名里的.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('请提供如下信息') # 设置文本框的标题
windows.geometry('1000x300') # 设置界面的大小
# 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)
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='点击继续', width=10, command=windows.quit) \
   .grid(row=4, column=1, sticky=tk.E, padx=10, pady=5) # sticky表示方位,NSWE为上下左右
tk.mainloop() # 结束循环
# 为变量赋值
word = str(e1.get())
number = int(e2.get()) - 1
choice = int(e3.get())

# 检查想要处理的sheet是否在所有的目标文件中
file_list = os.listdir(p1)
file_list.remove('.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
  mergedata1.to_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,并且命名为上一步骤确认的名字
 mergedata1.to_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中requests小技巧
May 10 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
PyQt5每天必学之组合框
Apr 20 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
Django中的FBV和CBV用法详解
Sep 15 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
python 代码运行时间获取方式详解
Sep 18 Python
Python 实现PS滤镜中的径向模糊特效
Dec 03 Python
利用For循环遍历Python字典的三种方法实例
Mar 25 Python
Python实现冒泡排序算法的完整实例
Nov 04 #Python
Lombok插件安装(IDEA)及配置jar包使用详解
Nov 04 #Python
基于OpenCV的路面质量检测的实现
Nov 04 #Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 #Python
python归并排序算法过程实例讲解
Nov 04 #Python
Numpy数组的广播机制的实现
Nov 03 #Python
基于Python组装jmx并调用JMeter实现压力测试
Nov 03 #Python
You might like
PHP中输出转义JavaScript代码的实现代码
2011/04/22 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
不安全的常用的js写法
2009/09/15 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
JS小游戏之象棋暗棋源码详解
2014/09/25 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
node网页分段渲染详解
2016/09/05 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Python numpy 点数组去重的实例
2018/04/18 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
python爬虫容易学吗
2020/06/02 Python
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
网络信息管理员岗位职责
2014/01/05 职场文书
校园歌咏比赛主持词
2014/03/18 职场文书
春节联欢会主持词
2014/03/24 职场文书
安全负责人任命书
2014/06/06 职场文书
会计专业自荐书
2014/07/08 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript
详细总结Python常见的安全问题
2021/05/21 Python
宝塔更新Python及Flask项目的部署
2022/04/11 Python