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

相关推荐
__Benco11 分钟前
OpenHarmony平台驱动开发(十一),PIN
人工智能·驱动开发·harmonyos
拓端研究室TRL12 分钟前
CNN-LSTM、GRU、XGBoost、LightGBM风电健康诊断、故障与中国银行股票预测应用实例
人工智能·神经网络·cnn·gru·lstm
零炻大礼包23 分钟前
【coze】意图识别(售前售后问题、搜索引擎去广告)
人工智能·coze
小小毛桃24 分钟前
使用PyTorch训练马里奥强化学习代理的完整指南
人工智能·pytorch·python
南玖yy32 分钟前
内存安全革命:工具、AI 与政策驱动的 C 语言转型之路
c语言·开发语言·c++·人工智能·安全·c++23·c++基础语法
SparkSql32 分钟前
FlinkCDC采集MySQL8.4报错
大数据·flink
TDengine (老段)33 分钟前
TDengine 在智慧油田领域的应用
大数据·数据库·物联网·时序数据库·iot·tdengine·iotdb
Dipeak数巅科技35 分钟前
数巅智能携手北京昇腾创新中心深耕行业大模型应用
人工智能·数据分析·商业智能bi
明朝百晓生37 分钟前
【Survival Analysis】【机器学习】【3】deepseek流程图
人工智能·机器学习
mzak37 分钟前
Linux系统(OpenEuler22.03-LTS)部署FastGPT
linux·人工智能·fastgpt