核心内容

将 DataFrame 导出为 Pickle、Feather、Parquet、HDF 等二进制格式,具备「速度快、体积小、保留 dtype」的优势。

一、to_pickle() — Python 原生序列化

import pandas as pd
 
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['x', 'y', 'z']})
 
# 导出
df.to_pickle('df.pkl')
 
# 读取
df_load = pd.read_pickle('df.pkl')
特性说明
保留内容数据 + index + columns + dtype + attrs
压缩自动使用 pickle 协议,可配合 gzip 等
安全⚠️ 不要加载不可信的 pickle 文件(存在代码执行风险)
跨语言仅限 Python
# 带压缩
df.to_pickle('df.pkl.gz', compression='gzip')

安全警告

Pickle 文件可执行任意代码,仅应从可信来源加载。

二、to_feather() — Feather 格式

Feather 是 Apache Arrow 定义的轻量列式二进制格式,读写极快。

# 导出(需要 pyarrow 或 feather-format)
df.to_feather('data.feather')
 
# 读取
df_load = pd.read_feather('data.feather')
特性说明
速度极快(接近内存拷贝速度)
保留 dtype完整保留(含 nullable、category 等)
依赖需要 pyarrow
设计目标跨语言数据交换(R / Python)
限制单 DataFrame,无压缩选项(Arrow IPC 本身高效)
# 在 R 中使用
# library(feather); read_feather("data.feather")

三、to_parquet() — Parquet 列式存储

Parquet 是 Hadoop 生态广泛使用的列式格式,压缩率高、适合大数据分析。

# 基础导出
df.to_parquet('data.parquet')
 
# 常用参数
df.to_parquet(
    'data.parquet',
    engine='pyarrow',        # 'pyarrow' / 'fastparquet'
    compression='snappy',    # 'snappy' / 'gzip' / 'zstd' / 'lz4' / None
    index=True,              # 是否保存索引
    partition_cols=['year'], # 按列分区存储(目录结构)
    storage_options={},      # S3 / GCS 等对象存储配置
    coerce_timestamps='ms',  # 时间戳精度转换
    allow_truncated_timestamps=False,
    row_group_size=10_000    # 行组大小
)
 
# 读取
df_load = pd.read_parquet('data.parquet')
特性说明
压缩比高(列式 + snappy / zstd)
大数据生态Spark / Hive / DuckDB 通用
保留元数据schema 完整保留
分区partition_cols 目录分区
谓词下推仅读取所需列(columns 参数)
# 分区分目录示例
df.to_parquet('output/', partition_cols=['region'])
# output/
# ├── region=North/
# │   └── part-0.parquet
# └── region=South/
#     └── part-0.parquet
 
# 只读部分分区
import pyarrow.parquet as pq
table = pq.read_table('output/', filters=[('region', '=', 'North')])

四、to_hdf() — HDF5 格式

HDF5 支持多数据集、分层存储,适合科学计算场景。

# 基础导出
df.to_hdf('data.h5', key='df')
 
# 常用参数
df.to_hdf(
    'data.h5',
    key='mydata',              # 数据集键名
    mode='w',                  # 'w' 覆盖 / 'a' 追加 / 'r' 只读
    format='table',            # 'fixed' 固定(快)/ 'table' 表格(可查询)
    append=True,               # format='table' 时追加
    complevel=5,               # 压缩级别 0-9
    complib='zlib',            # 'zlib' / 'lzo' / 'bzip2' / 'blosc'
    data_columns=['A', 'B'],   # 可查询的列(table 格式)
    encoding='utf-8',
    errors='strict',
    dropna=True
)
 
# 读取
df_load = pd.read_hdf('data.h5', key='mydata')
 
# 多数据集
df1.to_hdf('data.h5', key='df1')
df2.to_hdf('data.h5', key='df2')
 
# 查询(table 格式支持)
pd.read_hdf('data.h5', key='mydata', where="A > 2 & B == 'x'")
特性说明
多数据集一个文件中可存多个 key
条件查询format='table' 支持 where 过滤
压缩complevel + complib
依赖需要 tables(PyTables)库
使用场景科学计算、需局部读取的大型数据

HDFStore 高级用法

# 创建 HDFStore 对象
store = pd.HDFStore('data.h5', mode='a')
 
store['df1'] = df1          # 写入
store.append('df2', df2)    # 追加
print(store.keys())         # ['/df1', '/df2']
store.select('df1')         # 读取
store.get_storer('df1').table.read()   # 底层表
 
# where 过滤
store.select('df2', where="index > 100")
 
# 删除数据集
store.remove('df2')
 
# 关闭
store.close()

二进制格式对比

格式大小速度保留 dtype多数据集依赖跨语言
Pickle中快完整否无仅 Python
Feather小极快完整否pyarrow是(R)
Parquet最小快完整支持分区pyarrow/fastparquet广泛
HDF5小~中中完整是(key)tables是

选择建议

  • 临时缓存 / Python 内部:Pickle
  • 跨语言 / 极速读写:Feather
  • 大数据分析 / 持久化存档:Parquet
  • 多数据集科学计算:HDF5

相关笔记