如何将稀疏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
相关产品推荐
相关产品推荐

