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 被降级。

相关推荐
峙峙峙6 分钟前
线性代数--AI数学基础复习
人工智能·线性代数
二二孚日9 分钟前
自用华为ICT云赛道Big Data第四章知识点-Flink流批一体分布式实时处理引擎
大数据·华为
weiwuxian11 分钟前
揭开智能体的神秘面纱:原来你不是"超级AI"!
人工智能
Codebee12 分钟前
“自举开发“范式:OneCode如何用低代码重构自身工具链
java·人工智能·架构
说私域23 分钟前
基于开源AI智能名片链动2+1模式的S2B2C商城小程序:门店私域流量与视频号直播融合的生态创新研究
人工智能·小程序·开源
Ronin-Lotus26 分钟前
深度学习篇---Yolov系列
人工智能·深度学习
全干engineer41 分钟前
Spring Boot 实现主表+明细表 Excel 导出(EasyPOI 实战)
java·spring boot·后端·excel·easypoi·excel导出
Fireworkitte1 小时前
Java 中导出包含多个 Sheet 的 Excel 文件
java·开发语言·excel
静心问道1 小时前
GoT:超越思维链:语言模型中的有效思维图推理
人工智能·计算机视觉·语言模型
xufwind1 小时前
spark standlone 集群离线安装
大数据·分布式·spark