「Python+Pandas」自动化处理Excel的“分分合合”,非常实用
itomcoil 2025-05-30 15:11 6 浏览
话说Excel数据表,分久必合、合久必分。Excel数据表的“分”与“合”是日常办公中常见的操作。手动操作并不困难,但数据量大了之后,重复性操作往往会令人崩溃。利用Python的Pandas库,便可以自动实现Excel数据表的“分分合合”。下面结合实例来分享一些整理的实用代码片段。
分:纵向“分”
从数据平台(如问卷平台)中导出的数据往往是清单型的,每一行都是一条记录,数据量大的时候,表格往往是很“长”的。有时需要按照某列的不同数值,将一个总表“分”成单独的一些Excel文件。
一个工作表“分”为多个Excel文件
def to_excelByColName(sourceDf,colName,outPath,excelName):
'''
纵向“分”:一个工作表“分”为多个Excel文件
根据指定的列名中的不同值,分解Excel,并存储成多个Excel文件。
sourceDf:原始的DataFrame
colName:指定列名
outPath:输出路径
excelName:文件名,加.xlsx后缀
'''
colNameList = sourceDf[colName].drop_duplicates().tolist()
for eachColName in colNameList:
sourceDf[sourceDf[colName]==eachColName].to_excel('/'.join([outPath,eachColName+excelName]),index=False)
例如:将20个班级1000名学生的总表,按班级分成20个Excel文件。
调用 to_excelByColName 函数,效果如下:
to_excelByColName(sourceDf = sourceDf,colName="班级",outPath=".\分班数据表",excelName="生成数据表.xlsx")
一个工作表“分”为一个文件的多个sheet
def to_excelByColNameWithSheets(sourceDf,colName,outPath):
'''
纵向“分”:一个工作表“分”为一个文件的多个sheet
根据指定的列名中的不同值,分解Excel,并存储成单个Excel文件的多个Sheet。
sourceDf:原始的DataFrame
colName:指定列名
outPath:输出路径,加.xlsx后缀
'''
writer = pd.ExcelWriter(outPath)
colNameList = sourceDf[colName].drop_duplicates().tolist()
for eachColName in colNameList:
sourceDf[sourceDf[colName]==eachColName].to_excel(writer,sheet_name=eachColName)
writer.save()
例如:将20个班级1000名学生的总表,按班级分成1个Excel文件的20个sheet表。
调用
to_excelByColNameWithSheets 函数,效果如下:
to_excelByColNameWithSheets(sourceDf = sourceDf,colName="班级",outPath=".\分班数据表\生成数据表.xlsx")
分:横向“分”
在处理数据的时候,有时需要添加多个辅助列,这样也会让数据表越来越“宽”。而最终我们只需要某些关键列即可,那么这就涉及到横向数据分割,或者说提取某些列保持成一个单独的数据表。横向的分割只需要给DataFrame传入列名列表即可。
例如:只需要数据表中的姓名和班级字段,可以这样写。
df1 = sourceDf[["姓名","班级"]]
df1.to_excel("只含有姓名和班级的数据表.xlsx")
合:纵向“合”
对于结构相同的数据,在数据处理时可以将其在纵向上拼接,方便一起处理。
多个Excel文件合并成一个工作表
def readExcelFilesByNames(fpath,fileNameList=[],header=0):
'''
纵向“合”:多个Excel文件合并成一个工作表
读取路径下指定的Excel文件,并合并成一个总的DataFrame。
每个Excel文件的数据表格式上要一致。
1.fpath:必填,是Excel文件所在路径,不加文件名
2.fileNameList:需要读取的Excel文件名列表
3.header:指定读取的行数
'''
outdf = pd.DataFrame()
for fileName in fileNameList:
tempdf =pd.read_excel('/'.join([fpath,fileName]),header = header)
outdf = pd.concat([outdf,tempdf])
return outdf
例如:将20个班级的Excel文件,合并成一个数据表
调用 readExcelFilesByNames 函数,效果如下:
fileNameList = [
"六1班数据表.xlsx", "六2班数据表.xlsx", "六3班数据表.xlsx", "六4班数据表.xlsx",
"六5班数据表.xlsx", "六6班数据表.xlsx", "六7班数据表.xlsx", "六8班数据表.xlsx",
"六9班数据表.xlsx", "六10班数据表.xlsx", "六11班数据表.xlsx", "六12班数据表.xlsx",
"六13班数据表.xlsx", "六14班数据表.xlsx", "六15班数据表.xlsx", "六16班数据表.xlsx",
"六17班数据表.xlsx", "六18班数据表.xlsx", "六19班数据表.xlsx", "六20班数据表.xlsx",
]
readExcelFilesByNames(fpath = ".\分班数据表",fileNameList=fileNameList)
多个Sheet合并成一个工作表
def readExcelBySheetsNames(fpath,header = 0,prefixStr = "",sheetNameStr ="sheetName",prefixNumStr = "prefixNum"):
'''
纵向“合”:多个Sheet合并成一个工作表
读取所有的Excel文件的sheet,并合并返回一个总的DataFrame。
每个sheet的数据表格式上要一致。
1.fpath:必填,是Excel文件的路径,加文件名
2.会生成两个新列:sheetName和prefixNum,方便数据处理
sheetName列是所有sheet的名称列
prefixNum列是计数列
3.header:指定读取的行数
'''
xl = pd.ExcelFile(fpath)
# 获取Excel文件内的所有的sheet名称
sheetNameList = xl.sheet_names
outfd = pd.DataFrame()
num = 0
for sheetName in sheetNameList:
num += 1
data = xl.parse(sheetName,header=header)
# 产生sheet名称列和计数列
data[sheetNameStr] = sheetName
data[prefixNumStr] = prefixStr +str(num)
# 数据表拼接
outfd = pd.concat([outfd,data.dropna()])
xl.close()
return outfd
如下调用 readExcelBySheetsNames ,运行效果如下:
readExcelBySheetsNames(fpath = ".\分班数据表\总数据表.xlsx",sheetNameStr ="sheet名",prefixNumStr = "sheet序号")
合:横向“合”
对于不同Excel工作表之间的横向合并,主要是用根据某些列(如:姓名、身份证号等)进行合并。在pandas库中可以用 merge 方法来实现,这是个十分好用的方式,展开讲篇幅较长,后续详细整理。
DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
结语
本文所谈的Python处理Excel文件方式主要是基于 pandas 库的,主要针对的是 清单型的数据表。
数据表的 分 主要涉及的是文件保存(写入),对程序员来说属于 输出 环节;
数据表的 合 主要针对的是文件打开(读取),对程序而言属于 输入 环节。
以上代码在针对大量重复性的表格分与合时,优势巨大;但对于偶尔、少量的分与合,也许用鼠标点击更快。
原文链接:
https://www.cnblogs.com/wansq/p/15923443.html
相关推荐
- 蚂蚁金服用什么技术这么厉害?(蚂蚁金服是怎么赚钱的?)
-
阿里妹导读:本文来自蚂蚁金服人工智能部认知计算组的基础算法团队,文章提出一整套创新算法与架构,通过对TensorFlow底层的弹性改造,解决了在线学习的弹性特征伸缩和稳定性问题,并以GroupLass...
- R数据分析:逻辑斯蒂回归与泊松回归
-
今天将逻辑回归和泊松回归放一起给大家写写,因为它两在R中的做法都非常的相似和非常的简单,同时还有两个回归的图形化表达。什么时候用逻辑回归Logisticregression,alsoknown...
- 想学好Python数据分析,一定要掌握的重要模块之Statsmodels
-
Statsmodels是Python中一个功能强大且广泛使用的统计建模和经济计量学库。它允许用户构建各种统计模型,执行假设检验,进行预测,并对模型结果进行详细的诊断和可视化。以下是statsmodel...
- Python实现概率分布,学数据统计的需要收藏
-
作者:Runsen二项分布包含n个相同的试验每次试验只有两个可能的结果:“成功”或“失败”。出现成功的概率p对每一次试验是相同的,失败的概率q也是如此,且p+q=1。试验是互相独立的。试验成功或失败...
- 60行代码实现经典论文:0.7秒搞定泊松盘采样,比Numpy快100倍
-
编辑整理自太极图形量子位|公众号QbitAI由随机均匀的点组成的图案,在动植物身上已经很常见了。像杨梅、草莓、荔枝、红毛丹这样的水果,表面都有颗粒或者毛发状的结构,它们随机、均匀地散布在水果表...
- linux ubuntu 安装mongo教程(实践步骤)
-
最近需要在linux上安装mongdb由于之前没安装过。在网上搜索到很多安装方法,但有的按照步骤操作是不行的。前后共花费了半天时间找到一个可行的步骤,分享给大家,不必走弯路。如果安装过程遇到技术问题...
- MongoDB 分片集群方案及其优缺点分析
-
一、MongoDB分片集群架构核心组件1.Mongos(路由节点)-无状态代理,客户端连接入口-负责查询路由、结果聚合-需部署多个以实现高可用2.ConfigServer(配置服务器)-...
- CentOS7安装Mongodb 4.x.x(CentOS7安装yum源的方法)
-
1、下载安装包curl-Ohttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.6.tgz2、解压安装包tar-zxvfmon...
- MongoDB+GridFS存储文件方案(mongodb存储在哪里)
-
GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文...
- 如何使用 GridFS 、 Node.js、Mongodb和Multer 管理文件存储?
-
什么是GridFs?GridFs是用于存储音频、视频或图像等大型文件的mongodb规范……它最适用于存储超过mongodb文档大小限制(16MB)的文件。此外,无论文件大小如何,当您想...
- Mongodb 集群搭建方法(mongodb集群状态startup2)
-
#大有学问#MongoDB是一个非关系型数据库(NoSQL),提供高性能、高可用性和自动扩展的特点。在MongoDB中,可以通过搭建集群实现这些特性。MongoDB集群主要有两种类型:副本集(...
- 记一次生产事故:MongoDB数据分布不均的解决方案
-
推荐阅读:我为什么放弃MySQL,选择了MongoDB?看到这个数据你就会明白了事故集合:可以很明显可以看到我们这个集合的数据严重分布不均匀。一共有8个分片,面对这个情况我首先想到的是手动拆分数据块,...
- 百万级高并发mongodb集群性能数十倍提升优化实践
-
背景线上某集群峰值TPS超过100万/秒左右(主要为写流量,读流量很低),峰值tps几乎已经到达集群上限,同时平均时延也超过100ms,随着读写流量的进一步增加,时延抖动严重影响业务可用性。该集群采用...
- MongoDB 常见问题处理(二)(mongodb数据处理)
-
MongoDB数据库中,删除请求数超过阈值的处理方案?数据删除发生在文档迁移过程中,MongoDB4.0以上版本均衡阈值很小,容易发生迁移,频繁的迁移数据导致delete数据较大,同时还会导致CPU负...
- 实战:docker搭建FastDFS文件系统并集成SpringBoot
-
实战:docker搭建FastDFS文件系统并集成SpringBoot前言15年的时候,那时候云存储还远远没有现在使用的这么广泛,归根结底就是成本和安全问题,记得那时候我待的公司是做建站开发的,前期用...
- 一周热门
- 最近发表
-
- 蚂蚁金服用什么技术这么厉害?(蚂蚁金服是怎么赚钱的?)
- R数据分析:逻辑斯蒂回归与泊松回归
- 想学好Python数据分析,一定要掌握的重要模块之Statsmodels
- Python实现概率分布,学数据统计的需要收藏
- 60行代码实现经典论文:0.7秒搞定泊松盘采样,比Numpy快100倍
- linux ubuntu 安装mongo教程(实践步骤)
- MongoDB 分片集群方案及其优缺点分析
- CentOS7安装Mongodb 4.x.x(CentOS7安装yum源的方法)
- MongoDB+GridFS存储文件方案(mongodb存储在哪里)
- 如何使用 GridFS 、 Node.js、Mongodb和Multer 管理文件存储?
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)