如何将Pandas DataFrame保存为npz文件?附大文件高效方案
保存合并后DataFrame到NPZ文件的方法及高效实现方案
基础实现方式
NPZ是NumPy的压缩存储格式,本身用于存储NumPy数组,因此需要将DataFrame转换为适配的NumPy结构,同时可保留列名、索引等元信息:
转为结构化数组存储(保留列名)
利用Pandas的to_records方法将DataFrame转为结构化数组,列名会被保留在数组的dtype中,无需额外存储列名信息:import numpy as np import pandas as pd # 假设merged_df是处理完成的合并后DataFrame structured_array = merged_df.to_records(index=False) # 不需要保存索引则加index=False,反之移除 np.savez('merged_data.npz', data=structured_array)读取恢复的代码:
loaded_data = np.load('merged_data.npz') restored_df = pd.DataFrame(loaded_data['data'])拆分存储数据、列名与索引
若不想使用结构化数组,可将数据主体、列名、索引分别作为独立数组存入NPZ:np.savez('merged_data.npz', data=merged_df.values, columns=np.array(merged_df.columns), index=np.array(merged_df.index))读取恢复的代码:
loaded_data = np.load('merged_data.npz') restored_df = pd.DataFrame( loaded_data['data'], columns=loaded_data['columns'], index=loaded_data['index'] )
大DataFrame的高效存储优化
针对你的5000行30列规模的DataFrame,可通过以下方式提升存储效率与读写速度:
启用压缩存储
np.savez默认不压缩,改用np.savez_compressed可启用无损压缩,大幅减小文件体积,且对数值型数据的压缩效率极高:structured_array = merged_df.to_records(index=False) np.savez_compressed('merged_data_compressed.npz', data=structured_array)优化数据类型
先对DataFrame的字段类型做精简,比如将非必要的float64转为float32,大整数类型按需转为int32/int16,减少内存占用与文件体积,间接提升读写速度:# 示例:优化字段数据类型 merged_df['temperature'] = merged_df['temperature'].astype('float32') merged_df['user_id'] = merged_df['user_id'].astype('int32') # 再转结构化数组并压缩存储 structured_array = merged_df.to_records(index=False) np.savez_compressed('merged_data_optimized.npz', data=structured_array)补充:专用表格存储格式(可选)
如果并非必须使用NPZ,Pandas自带的to_parquet或to_feather格式更适合表格数据:它们支持列存储、读写速度更快,且能完整保留DataFrame的所有元信息。但如果业务要求必须用NPZ,上述方法已足够高效。
内容的提问来源于stack exchange,提问作者Akash Parmar
相关产品推荐
相关产品推荐

