news 2026/4/28 1:00:47

pandas高效数据存取:深入解析pd.read_parquet()与pd.to_parquet()的实战应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pandas高效数据存取:深入解析pd.read_parquet()与pd.to_parquet()的实战应用

1. 为什么Parquet是数据分析师的秘密武器?

第一次接触Parquet格式时,我和大多数数据分析师一样满脑子问号:CSV用得好好的,为什么要换?直到有一次处理一个3GB的销售数据CSV文件,我的Python脚本加载了整整15分钟,而同事用Parquet格式只用了不到30秒。这个性能差距让我彻底改变了看法。

Parquet本质上是一种列式存储格式,和我们熟悉的CSV行存储完全不同。想象一下图书馆找书的场景:CSV就像把所有书平铺在地上,要找特定章节必须翻阅整本书;而Parquet则是把书按章节分类摆放,可以直接抽取需要的部分。这种设计带来三个核心优势:

  1. 读取速度飞跃:只扫描需要的列数据,I/O负载大幅降低。实测一个20列的电商数据,只读取其中5列时,Parquet比CSV快8-12倍
  2. 存储空间节省:列式存储+高效压缩(默认Snappy)让文件体积缩小75%以上。我经手的一个10GB的CSV转成Parquet后只剩2.3GB
  3. 类型保持完整:不像CSV会丢失日期、分类等类型信息,Parquet完美保留DataFrame的元数据

特别当数据量超过1GB时,这种优势会呈指数级放大。上周我处理的一个用户行为数据集,原始CSV加载需要7分钟,转存Parquet后首次读取仅需11秒——这还没用任何缓存技巧!

2. 数据存储实战:pd.to_parquet()的深度玩法

2.1 基础存储与引擎选择

最简单的存储操作只需要一行代码:

df.to_parquet('data.parquet')

但魔鬼藏在细节里。engine参数决定了底层处理库,实测发现不同引擎表现差异明显:

引擎类型写入速度读取速度兼容性适用场景
pyarrow最快最好新版本Python首选
fastparquet中等中等较好旧环境兼容
auto(默认)可变可变依赖环境无特殊需求时使用

我习惯显式指定引擎避免意外:

df.to_parquet('data.parquet', engine='pyarrow')

2.2 高级参数调优

压缩算法的选择会显著影响存储效率。通过这个对比实验可以看出差异:

# 测试不同压缩算法 for compression in ['snappy', 'gzip', 'brotli']: start = time.time() df.to_parquet(f'data_{compression}.parquet', compression=compression) size = os.path.getsize(f'data_{compression}.parquet')/1024/1024 print(f"{compression}: {size:.2f}MB | {time.time()-start:.2f}s")

实测结果:

  • snappy:写入最快(2.1s),体积中等(156MB)
  • gzip:写入稍慢(3.4s),体积最小(121MB)
  • brotli:写入最慢(8.7s),体积与gzip相当

分块存储是处理超大数据集的利器。当DataFrame超过1GB时,建议启用:

df.to_parquet('chunked_data', partition_cols=['year', 'month'], engine='pyarrow')

这会把数据按年月分目录存储,后续可以按需读取特定时间段数据。我在处理IoT设备数据时,这个技巧让内存占用从32GB降到了4GB。

3. 高效读取:pd.read_parquet()的进阶技巧

3.1 列裁剪与谓词下推

这是Parquet最强大的特性之一。假设我们有一个包含50列的电商数据集,但只需要用户ID和购买金额:

# 只读取特定列 df = pd.read_parquet('ecommerce.parquet', columns=['user_id', 'amount'])

在我的测试中,这种操作比读取全部列快20倍,内存消耗减少90%。

更高级的谓词下推功能可以直接在读取时过滤数据:

# 使用PyArrow引擎的过滤功能 df = pd.read_parquet('sales.parquet', filters=[('date', '>', '2023-01-01'), ('region', '=', 'East')])

注意这个功能需要pyarrow引擎支持,实测在时间范围查询场景下,速度比先读后滤快50倍。

3.2 类型处理与性能陷阱

Parquet虽然会保留数据类型,但有些细节需要注意:

# 处理分类数据的最佳实践 df = pd.read_parquet('data.parquet', use_nullable_dtypes=True) # 保留Nullable类型

常见坑点:

  1. 混合使用引擎可能导致类型不一致
  2. 旧版fastparquet对日期类型支持不完善
  3. 分类数据如果不指定dtype可能被误判为object

建议在关键流程中添加类型检查:

# 类型验证代码示例 assert df['user_id'].dtype == 'int32' assert pd.api.types.is_categorical_dtype(df['category'])

4. 完整工作流案例:电商数据分析实战

让我们通过一个真实场景串联所有知识点。假设要分析某电商年度销售数据:

4.1 原始数据准备

# 读取CSV并转换 raw_df = pd.read_csv('sales_2023.csv', parse_dates=['order_date']) raw_df.to_parquet('sales_2023.parquet', engine='pyarrow', compression='snappy', partition_cols=['quarter'])

4.2 按需分析读取

# 只读取Q4且金额>1000的订单 analysis_df = pd.read_parquet('sales_2023.parquet', filters=[('quarter', '=', 4), ('amount', '>', 1000)], columns=['order_id', 'customer_id', 'amount'])

4.3 结果存储优化

# 存储分析结果 analysis_df.to_parquet('high_value_orders.parquet', index=False, # 避免存储无用索引 compression='gzip') # 选择更高压缩比

这个流程相比传统CSV方式,在我的ThinkPad P1笔记本上测试:

  • 存储空间:从4.7GB → 1.2GB
  • 读取时间:从3分21秒 → 9秒
  • 内存占用:从12GB → 800MB

5. 避坑指南与性能基准

5.1 常见问题排查

中文乱码问题通常源于引擎选择:

# 解决方案 df.to_parquet('data.parquet', engine='pyarrow') # fastparquet可能有编码问题

版本兼容性陷阱:

  • PyArrow 6.0+需要pandas 1.4+
  • Fastparquet最新版已停止维护

内存溢出的预防措施:

# 分块读取大文件 chunk_iter = pd.read_parquet('huge_data.parquet', chunksize=100000) for chunk in chunk_iter: process(chunk)

5.2 性能基准测试

使用纽约出租车数据(1.2GB CSV)进行对比测试:

操作CSV格式Parquet基础Parquet优化
写入48s22s18s(snappy压缩)
全量读取29s3.2s2.8s(pyarrow引擎)
列裁剪读取29s(全读)0.9s0.4s(列+过滤)
存储空间1.2GB287MB211MB(gzip压缩)

这些优化技巧让我上周处理季度报表的时间从3小时缩短到了25分钟。最惊喜的是在AWS Lambda上跑ETL时,内存消耗从1.5GB降到了256MB,直接省下了75%的云计算成本。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 20:08:30

微信聊天记录导出终极指南:3步轻松备份iOS微信历史对话

微信聊天记录导出终极指南:3步轻松备份iOS微信历史对话 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾担心珍贵的微信聊天记录会随着手机更换而消失…

作者头像 李华
网站建设 2026/4/17 13:59:46

Jetson Orin NX 外置刷机失败解决办法

具体报错 Welcome to Tegra Flash version 1.0.0 Type ? or help for help and q or quit to exit Use ! to execute system commands Entering RCM boot [ 0.0749 ] mb1_t234_prod_aligned_sigheader.bin.encrypt filename is from --mb1_bin [ 0.0749 ] psc_bl1_t234_prod…

作者头像 李华
网站建设 2026/4/15 11:54:34

预训练模型中的位置编码:绝对位置、相对位置与旋转位置编码

点击 “AladdinEdu,你的AI学习实践工作坊”,注册即送-H卡级别算力,沉浸式云原生集成开发环境,80G大显存多卡并行,按量弹性计费,教育用户更享超低价。 1. 引言:当自注意力忘记了顺序 Transforme…

作者头像 李华