You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将稀疏Pandas DataFrame保存为Parquet文件?PyArrow不支持稀疏类型

解决Pandas稀疏DataFrame无法保存为Parquet的问题

因为pyarrow暂不支持Pandas稀疏数据类型的Parquet序列化,且你无法将数据转为密集格式,推荐以下两种可行方案:

方案1:拆分稀疏数据核心组件+元数据存储

把稀疏DataFrame拆成行索引、列名、稀疏矩阵的核心结构数据(indptr、indices、data),用Parquet保存这些结构化信息,读取时再重建稀疏DataFrame。这种方式完全保留行列名,且避免转为密集格式。

保存代码

from scipy.sparse import csr_matrix
import numpy as np
import pandas as pd

# 生成示例稀疏DataFrame
arr = np.random.random(size=(1000, 5))
arr[arr < .9] = 0
sp_arr = csr_matrix(arr)
sdf = pd.DataFrame.sparse.from_spmatrix(sp_arr, columns=['a','b','c','d','e'])

# 拆分数据:元数据+稀疏矩阵核心组件
save_data = {
    'row_index': sdf.index,
    'columns': sdf.columns,
    'indptr': sp_arr.indptr,
    'indices': sp_arr.indices,
    'data': sp_arr.data
}

# 转为常规DataFrame(所有列都是非稀疏类型)后保存为Parquet
pd.DataFrame(save_data).to_parquet('sparse_data.parquet')

读取并重建稀疏DataFrame

import pandas as pd
from scipy.sparse import csr_matrix

# 读取Parquet文件
loaded_data = pd.read_parquet('sparse_data.parquet')

# 重建csr矩阵
sp_arr = csr_matrix(
    (loaded_data['data'], loaded_data['indices'], loaded_data['indptr']),
    shape=(len(loaded_data['row_index'].unique()), len(loaded_data['columns'].unique()))
)

# 重建稀疏DataFrame
sdf_loaded = pd.DataFrame.sparse.from_spmatrix(
    sp_arr,
    index=loaded_data['row_index'].unique(),
    columns=loaded_data['columns'].unique()
)

方案2:使用HDF5格式直接保存稀疏DataFrame

Pandas的HDFStore原生支持稀疏数据类型的存储,适合需要直接保存完整DataFrame结构的场景:

保存代码

# 接之前生成的sdf
with pd.HDFStore('sparse_data.h5') as store:
    store['sdf'] = sdf

读取代码

with pd.HDFStore('sparse_data.h5') as store:
    sdf_loaded = store['sdf']

注意:HDF5格式的跨工具兼容性不如Parquet广泛,但在Pandas生态内读写便捷,无需手动拆分数据。

内容的提问来源于stack exchange,提问作者Sandwichnick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:06:19