pandas读取大型Excel文件提速及加载时过滤空值的解决方案
优化方案
1. 更换读取引擎(提速最明显)
默认pd.read_excel使用openpyxl处理xlsx文件,读取大文件性能很差,pandas 2.0及以上版本支持切换为Rust开发的calamine引擎,仅需新增一个参数即可将读取速度提升3~10倍,300万行3列的场景通常可以压到10秒以内。
使用前先安装依赖:pip install calamine
2. 加载时的额外优化
- 你当前已经使用
usecols指定读取列,这个操作已经避免了加载无关列带来的性能损耗,可以保持使用。 - 新增
dtype参数提前指定3列的字段类型,避免pandas自动推断类型的耗时,例如你读取的3列分别是字符串、浮点型、整型,可以写为dtype={4: str, 21: float, 22: int},索引对应你选的原Excel列的序号。
3. NA值过滤处理
pd.read_excel没有提供加载时直接过滤NA的参数,但是你仅加载3列数据的场景下,读取完成后再调用dropna的耗时可以忽略不计,比逐行读取过滤的方案效率高得多。
4. 长期使用的最优方案
如果这个文件你需要反复读取,可以第一次读取完成后将筛选后的3列数据存储为parquet格式,后续读取仅需几百毫秒,无需重复解析Excel文件,且完全不需要修改原Excel文件:
# 第一次读取后存为parquet格式副本 email.to_parquet(f"{email_path}email_filtered.parquet") # 后续读取直接调用parquet文件即可 email = pd.read_parquet(f"{email_path}email_filtered.parquet")
优化后的完整代码
import pandas as pd email_path = r'C:\Users\318459\Desktop\\' email_path = email_path.replace('\\', '/') cols = [4, 21, 22] # 新增engine、dtype参数,根据你的实际字段类型调整dtype配置 email = pd.read_excel( f'{email_path}{email_file}', sheet_name="Vigo_Banking_for_Credit", index_col=None, usecols=cols, engine="calamine", dtype={4: str, 21: float, 22: int} # 按需修改对应列的类型 ).dropna() # 直接过滤含NA的行,耗时可忽略
内容的提问来源于stack exchange,提问作者Webb
相关产品推荐
相关产品推荐

