二进制格式存取速度快、保留数据类型信息,适合中间存储、缓存数据或大规模数据交换。列式存储(Parquet、ORC、Feather)尤其适合大数据分析与数据湖场景。


1. Pickle

pickle 是 Python 内置的序列化格式。pandas 的 read_pickle / to_pickle 是最简单的存取方式,保留 DataFrame/Series 的全部信息(索引、dtype、列名等)。

使用示例

# 写出
df.to_pickle('data.pkl')
 
# 读取
df = pd.read_pickle('data.pkl')

安全性警告

Pickle 文件可执行任意代码。绝对不要加载来自不可信来源的 pickle 文件。


2. Feather

Feather 是 Apache Arrow 定义的跨语言列式存储格式,读写速度极快,适合在 Python 与 R 之间共享数据。

函数签名

pd.read_feather(path, columns=None, use_threads=True, storage_options=None)
DataFrame.to_feather(path, mode='w', compression='lz4', compression_level=None, storage_options=None)
参数说明
columns读取列
use_threads是否使用多线程读取
mode'w' 或 'a'
compression压缩算法:'lz4'、'zstd'、'uncompressed'
compression_level压缩级别
# 写出
df.to_feather('data.feather')
 
# 读取指定列
df = pd.read_feather('data.feather', columns=['A', 'B'])

依赖提示

需要安装 pyarrow:pip install pyarrow


3. Parquet

Parquet 是 Hadoop/数据湖生态中最流行的列式存储格式,支持复杂嵌套结构、分区、压缩与谓词下推。适合大规模数据分析。

函数签名

pd.read_parquet(
    path, engine='auto', columns=None, storage_options=None,
    use_nullable_dtypes=False, dtype_backend=_NoDefault.no_default,
    filesystem=None, filters=None
)
 
DataFrame.to_parquet(
    path, engine='auto', compression='snappy', index=None,
    partition_cols=None, storage_options=None, use_nullable_dtypes=False,
    compression_level=None, data_page_size=None, use_deprecated_int96_timestamps=False,
    coerce_timestamps=None, allow_truncated_timestamps=False, row_group_size=None
)

参数详解

参数说明
path文件路径或目录(分区时)
engine'auto'、'pyarrow' 或 'fastparquet'
columns读取列
filters谓词下推过滤(如 [('column', '>', 100)])
use_nullable_dtypes是否使用可空类型(如 Int64、string)
dtype_backend类型后端:'numpy_nullable' 或 'pyarrow'
compression'snappy'、'gzip'、'brotli'、'zstd'、'lz4' 等
compression_level压缩级别
index是否写出索引
partition_cols按这些列分区写出
row_group_size行组大小
data_page_size数据页大小

使用示例

# 读取
df = pd.read_parquet('data.parquet')
 
# 按条件过滤读取(谓词下推,减少 IO)
df = pd.read_parquet('data.parquet', filters=[('date', '>=', '2024-01-01')])
 
# 分区写出
df.to_parquet('output_dir', partition_cols=['year', 'month'])
 
# 指定压缩
df.to_parquet('data.parquet', compression='zstd')

依赖提示

需要安装 pyarrow 或 fastparquet:pip install pyarrow


4. ORC

ORC(Optimized Row Columnar)是 Hive/Spark 生态常用的列式存储格式,针对大吞吐量读取优化。

pd.read_orc(path, columns=None, dtype_backend=_NoDefault.no_default, filesystem=None, storage_options=None, use_nullable_dtypes=_NoDefault.no_default)
DataFrame.to_orc(path, engine='pyarrow', index=None, engine_kwargs=None, storage_options=None)
# 读取
df = pd.read_orc('data.orc')
 
# 写出
df.to_orc('data.orc')

依赖提示

需要安装 pyarrow:pip install pyarrow


5. HDF5

HDF5 是科学计算领域广泛使用的层级数据格式,适合存储大型数组与分组数据集。

pandas 接口

pd.read_hdf(path_or_buf, key=None, mode='r', errors='strict', where=None, start=None, stop=None, columns=None, iterator=False, chunksize=None)
DataFrame.to_hdf(path_or_buf, key, mode='a', complevel=0, complib=None, append=False, format=None, index=True, min_itemsize=None, nan_rep=None, dropna=None, data_columns=None, errors='strict')

参数详解

参数说明
keyHDF5 中数据的标识符(必填)
mode'r'(读)、'w'(写覆盖)、'a'(追加)
format'fixed'(固定格式,快)或 'table'(可查询、可追加)
complevel压缩级别 0-9
complib压缩库:'zlib'、'lzo'、'bzip2'、'blosc'
append是否追加
data_columns作为可查询列的列(format='table' 时)
# 写入
df.to_hdf('data.h5', key='mydata', format='table')
 
# 读取指定键
df = pd.read_hdf('data.h5', key='mydata')
 
# 按条件读取(需要 table 格式)
df = pd.read_hdf('data.h5', key='mydata', where='age > 30')

依赖提示

需要安装 tables:pip install tables


HDFStore

HDFStore 提供类似字典的接口,可在同一个 HDF5 文件中管理多个数据集。

# 打开存储
with pd.HDFStore('store.h5') as store:
    # 写入多个数据集
    store['df1'] = df1
    store.put('df2', df2, format='table')
 
    # 读取
    df1_back = store['df1']
 
    # 列出所有键
    print(store.keys())
 
    # 遍历
    for key in store:
        data = store[key]
 
    # 条件查询
    result = store.select('df2', where='col > 10')
 
    # 删除
    store.remove('df1')

HDFStore 常用方法

方法说明
put(key, df)写入
get(key)读取
select(key)查询(支持 where 条件)
keys()列出所有键
remove(key)删除
append(key, df)追加数据
info()存储信息
close()关闭文件

格式选择建议

场景推荐格式
临时缓存(可信环境)Pickle
跨语言共享(R/Python)Feather
大数据分析 / 数据湖Parquet
列式存储与 Hadoop 生态ORC
科学计算 / 多数据集管理HDF5

文档 7:4.6 SQL.md