python利用pandas合并excel表格代码_利用Python pandas对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:

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合并内容请搜索随便开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持随便开发网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java定义一个方法,返回一个整数数组的和

java定义一个方法&#xff0c;返回一个整数数组的和 /*** 定义一个方法* 返回一个整数数组的和*/ public class Test22 {//定义数组public static int getArraySum(int[] arr){int sum 0;for (int i 0; i < arr.length; i) {sumarr[i];}return sum;}public static void m…

后端在插入数据发现重复如何正确的弹出警告_前百度面试官整理的——Java后端面试题(一)...

List 和 Set 的区别 List , Set 都是继承自 Collection 接口 List 特点&#xff1a;元素有放入顺序&#xff0c;元素可重复 &#xff0c;Set 特点&#xff1a;元素无放入顺序&#xff0c;元素不可重复&#xff0c;重复元素会覆盖掉&#xff0c;(元素虽然无放入顺序&#xff0c;…

java定义一个方法,返回整数数组的元素最大值

java定义一个方法&#xff0c;返回整数数组的元素最大值 /*** 定义一个方法* 返回整数数组的元素最大值*/ public class Test23 {public static int maxArray(int[]arr){int max arr[0];for (int i 0; i < arr.length; i) {if (max<arr[i]){max arr[i];}}return max;…

java定义一个方法,返回一个整数数组的元素最小值

java定义一个方法&#xff0c;返回一个整数数组的元素最小值 /*** 定义一个方法* 返回一个整数数组的元素最小值*/ public class Test24 {public static int minArray(int[] arr){int min arr[0];for (int i:arr) {if (min>i){min i;}}return min;}public static void ma…

anaconda方法安装python教程_anaconda的安装教程和使用方法

一、anaconda安装方法&#xff1a;1、下载&#xff1a;anaconda官方下载地址&#xff1a;https://www.anaconda.com/download/2、安装:可以自己指定路劲&#xff0c;也可以选择默认安装&#xff0c;最后记得点击添加环境变量二、使用方法&#xff1a;1、打开cmd&#xff0c;创建…

java义一个方法,返回一组双色球票数

java义一个方法&#xff0c;返回一组双色球票数 import java.util.Arrays;/*** 定义一个方法&#xff0c;返回一组双色球票数* 双色球规则* 前六位&#xff0c;红球 1-33 不能重复&#xff0c;升序排列* 最后一位&#xff0c;篮球 1-16 可以和前六位重复*/ public class Test2…

mysql触发器如何获取当前表名_MCGS pro组态环境下,如何获取当前用户名,在画面上显示?...

熟悉昆仑通态触屏的工程师、技术员都知道&#xff0c;无论是在MCGS嵌入版软件&#xff0c;还是在MCGS通用版软件&#xff0c;亦或者是现在的MCGS pro软件&#xff0c;都含有一个共同的系统变量“$UserName”。在嵌入式版本中&#xff0c;用户可以直接调用该“$UserName”变量&a…

java定义一个方法,返回一个整数数组的元素平均值

java定义一个方法&#xff0c;返回一个整数数组的元素平均值 /*** 定义一个方法* 返回一个整数数组的元素平均值*/ public class Test25 {public static double avgArray(int[] arr){int sum 0;for(int x:arr){sumx;}return sum*1.0/arr.length;}public static void main(Str…

md5加密解密代码_Python内置方法实现基于秘钥的信息加解密

点击关注州的先生 精彩不容错过在实际编程开发中&#xff0c;我们会使用到各类的加密算法来对数据和信息进行加密。比如密码中比较常见的MD5加密&#xff0c;以及AES加密等等。对于密码认证来说&#xff0c;MD5加密是比较适合的&#xff0c;因为其不需要接触到明文的数据&#…

java实参将数据传递给形参的两种形式

java实参将数据传递给形参的两种形式 /*** java实参将数据传递给形参的两种形式* 1&#xff0c;按值传递* 2&#xff0c;按引用传递* * 当参数是基本数据类型时&#xff0c;数据不占用堆内存&#xff0c;按值传递* 当参数是引用类型时&#xff0c;数据占用堆内存&#xff0c;按…

python css和xpath_Selenium系列教程(四)css、xpath定位(基于 Python)

#!/usr/bin/env pythonimporttimefrom selenium importwebdriverdriverwebdriver.Chrome()driver.get("http://localhost:63342/webtest/demo.html")#节点driver.find_element_by_xpath("/html/body/div") #绝对路径&#xff0c;从根节点开始&#xff0c;一…

论java中可变参数

论java中可变参数 /*** ...可变参数* 当... 作为形参时&#xff0c;传入的实参是可变的* 在方法体内部&#xff0c;仍然可将可变参数当成数组使用* 如果传入的实参是多个单独的变量&#xff0c;程序会自动将多个单独的变量放入数组** 可变参数的好处* 1&#xff0c;传入数组ok…

mplab x ide 中文使用手册_中文文档:MPLAB ICD 4在线调试器用户指南

MPLAB ICD 4在线调试器用户指南MPLAB ICD 4在线调试器(DV164045)是Microchip最快且最经济高效的调试和编程工具&#xff0c;适用于Microchip PIC、dsPIC闪存和CEC(基于ARM Cortex-M4)单片机。可与功能强大且拥有易于使用的图形用户界面的MPLAB X集成开发环境(IDE)配合使用&…

java定义一个方法计算三角形,长方形,圆形面积和周长

java定义一个方法计算三角形&#xff0c;长方形&#xff0c;圆形面积和周长 /*** 定义一个方法&#xff0c;返回一个圆的周长 半径* 定义一个方法&#xff0c;返回一个圆的面积 半径* 定义一个方法&#xff0c;返回一个矩形的周长 长 宽* 定义一个方法&#xff0c;返回一个…

python可以处理多大的数据_科多大数据之Python基础教程之Excel处理库openpyxl详解...

原标题&#xff1a;科多大数据之Python基础教程之Excel处理库openpyxl详解科多大数据小课堂来啦~Python基础教程之Excel处理库openpyxl详解openpyxl是一个第三方库&#xff0c;可以处理xlsx格式的Excel文件。pipinstallopenpyxl安装。读取Excel文件需要导入相关函数fromopenpyx…

java练习(数组工具类的封装)[目前写过最长的代码,虽然不难]

java练习&#xff08;数组工具类的封装&#xff09;[目前写过最长的代码&#xff0c;虽然不难] package myUtil.arrayUtil;public class ArraysUtil {/*** 升序排列一个byte数组* param arr 要排列的byte数组*/public static void sortASC(byte[] arr){for (int i 0;i<arr…

python center函数对齐方式_Python如何对齐字符串

问题你想通过某种对齐方式来格式化字符串解决方案对于基本的字符串对齐操作&#xff0c;可以使用字符串的ljust(), rjust()和 center()方法。比如&#xff1a;>>> text Hello World>>> text.ljust(20)Hello World >>> text.rjust(20) Hello World&…

python新奇检测_3种Python检测URL状态

需求&#xff1a;Python检测URL状态&#xff0c;并追加保存200的URL代码一&#xff1a;#! /usr/bin/env python#codingutf-8import sysimport requestsdef getHttpStatusCode(url):try:request requests.get(url)httpStatusCode request.status_codereturn httpStatusCodeexc…

java面向对象第一课,定义类,模拟人的行为:吃饭工作休息

java面向对象第一课&#xff0c;定义类&#xff0c;模拟人的行为&#xff1a;吃饭工作休息 /*** 定义类&#xff0c;模拟人的行为&#xff1a;吃饭工作休息*/ public class Person {//静态特征&#xff1a;成员变量 属性 fieldString name; //姓名int age; //年龄//动态…

java使用计算器完成加法、减法运算

java使用计算器完成加法、减法运算 package demo03;/*** 使用计算器完成加法、减法运算*/ public class Calculator {//成员变量private String brand; //品牌private double size; //尺寸//成员方法//加法public int add(int num1,int num2){int result;result num1nu…