19.如何使用 pandas 处理大型 Excel 文件:并行读取工作表

在使用 pandas 的 read_excel 函数读取大型工作簿的多张工作表时,你会发现这个过程会花很长时间。这是因为 pandas 会逐张读取工作表。要想让这个过程更快,可以并行读取这些工作表。让工作簿写入过程并行化很难,但并行读取多张工作表是很容易的。

在 Python 中,如果想充分利用现代计算机都具备的多核处理器,就需要使用标准库中的多线程包。多线程包会生成多个并行执行任务的 Python 解释器(通常一个 CPU 核心一个解释器)。此时不再是逐张处理工作表,而是一个 Python 解释器处理第一张工作表,与此同时另一个 Python 解释器处理第二张工作表,以此类推。

对于包含多个大型工作簿的大型文件的情况,多线程可以显著加快读取过程,不过这是在假定你的系统有足够的内存处理工作负载的情况下。


一 使用 parallel_pandas.py 并行读取工作表

parallel_pandas.py,这是使用 OpenPyXL 并行读取工作表的一种简单实现方式。(里面有两个函数:_read_sheet 和 read_excel)
链接: https://pan.baidu.com/s/1nIBGqVkXFj-fZCBPVWN8eg?pwd=68q2 提取码: 68q2

python 复制代码
# 1.py

import parallel_pandas

def main():
    a = parallel_pandas.read_excel("xl/stores.xlsx", sheet_name=None)
    print(a)

if __name__ == '__main__':
    main()

parallel_pandas.read_excel(filename, sheet_name=None):调用了parallel_pandas模块中的read_excel函数。filename是你要读取的Excel文件的路径。sheet_name=None表示你想读取Excel文件中的所有工作表。如果你只想读取特定的工作表,可以提供一个工作表名称的列表作为sheet_name参数的值。

read_excel函数返回一个字典,其中键是工作表的名称,值是与该工作表对应的pandas.DataFrame对象。例如,如果你的Excel文件包含名为"Sheet1"和"Sheet2"的两个工作表,函数将返回一个类似于{"Sheet1": df1, "Sheet2": df2}的字典,其中df1df2分别是这两个工作表对应的DataFrame。


二 两种魔法指令

魔法指令是特定于 Jupyter Notebook 等环境的一种特殊命令,用于提供便捷的功能。它们通常以 %%% 开头。单个 % 前缀的魔法指令应用于单行代码,而双 %% 前缀的魔法指令应用于整个代码单元格。

1.%%time

用途:测量整个代码单元格的执行时间。

真实时间(wall time):从代码开始执行到结束所经过的总时间。这包括了代码运行期间的所有等待时间,比如等待CPU或其他资源。

CPU时间(在macOS或Linux系统上可用):这包括用户模式(user)和系统模式(sys)下的CPU时间,以及总CPU时间。用户模式时间是指CPU在用户程序上花费的时间,而系统模式时间是指CPU在操作系统内核中花费的时间。CPU时间可能比真实时间短(如果CPU资源不足,程序需要等待)或长(如果程序利用多核处理器并行执行)。

2.%%timeit

用途:更准确地测量代码的执行时间。

适用场景:当你需要更精确地了解代码性能时。

3. %%time %%timeit 的区别

%%time适用于快速查看代码执行的大致时间,而%%timeit则提供更精确的性能测量,通过多次执行并取平均值来减少误差。


三 体验并行读取 big.xlsx

如果你正在处理Excel文件(无论是较新的.xlsx格式还是旧式的.xls格式),并且你希望加快处理速度,有一种方法是将文件读取和处理过程并行化。

parallel_openpyxl.py:这个脚本实现了使用 OpenPyXL 库并行化读取和处理 .xlsx 格式文件的功能。通过并行化OpenPyXL的使用,你可以绕过Pandas库(Pandas通常用于数据处理,但会先将数据加载到DataFrame中,这可能会成为性能瓶颈),直接从Excel文件中读取和处理数据,从而可能提高速度。

parallel_xlrd.py:这个脚本是针对旧式的.xls格式文件,使用xlrd库实现并行化读取。通过并行化xlrd的使用,你可以直接处理.xls文件中的数据,而不需要先通过Pandas将其转换为DataFrame。

通过并行化读取和处理Excel文件的过程,并直接使用底层的库而不是Pandas,可以提升处理Excel数据的代码的运行速度。

通过直接使用这些底层的库(OpenPyXL和xlrd),你可以避免Pandas在处理大量数据时可能带来的性能开销,因为Pandas在读取Excel文件时,会先将整个文件加载到内存中,形成一个DataFrame对象,这个过程可能会比较耗时。而直接使用OpenPyXL或xlrd,你可以更灵活地处理数据,比如按需读取数据行或列,以及应用必要的清理过程(如去除空白行、转换数据类型等),这些操作都可以并行执行,从而可能显著提高整体处理速度。


四 只需读取单张大型工作表

使用 Modin 并行读取工作表,并行处理单张工作表的读取过程,并实现显著的速度提升。

Modin 需要指定版本的 pandas,安装 Modin 时可能会导致 Anaconda 附带的 pandas 被降级。

相关推荐
音视频牛哥2 小时前
打通视频到AI的第一公里:轻量RTSP服务如何重塑边缘感知入口?
人工智能·计算机视觉·音视频·大牛直播sdk·机器视觉·轻量级rtsp服务·ai人工智能
Wendy14413 小时前
【灰度实验】——图像预处理(OpenCV)
人工智能·opencv·计算机视觉
中杯可乐多加冰3 小时前
五大低代码平台横向深度测评:smardaten 2.0领衔AI原型设计
人工智能
无线图像传输研究探索3 小时前
单兵图传终端:移动场景中的 “实时感知神经”
网络·人工智能·5g·无线图传·5g单兵图传
zzywxc7874 小时前
AI在编程、测试、数据分析等领域的前沿应用(技术报告)
人工智能·深度学习·机器学习·数据挖掘·数据分析·自动化·ai编程
铭keny4 小时前
YOLOv8 基于RTSP流目标检测
人工智能·yolo·目标检测
墨尘游子5 小时前
11-大语言模型—Transformer 盖楼,BERT 装修,RoBERTa 直接 “拎包入住”|预训练白话指南
人工智能·语言模型·自然语言处理
金井PRATHAMA5 小时前
主要分布于内侧内嗅皮层的层Ⅲ的网格-速度联合细胞(Grid × Speed Conjunctive Cells)对NLP中的深层语义分析的积极影响和启示
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·知识图谱
天道哥哥5 小时前
InsightFace(RetinaFace + ArcFace)人脸识别项目(预训练模型,鲁棒性很好)
人工智能·目标检测