保存DataFrame时,pandas pd.to_pickle与pickle.dump有何差异?
pandas.to_pickle 与 pickle.dump 保存DataFrame的差异分析
我想对比使用pandas.DataFrame.to_pickle和标准库pickle.dump保存DataFrame对象的差异,为此做了以下测试:
测试代码
import pandas as pd import pickle df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'), index=['x', 'y']) # 保存文件 df.to_pickle('df1.pickle') with open('df2.pickle','wb') as f: pickle.dump(df, f) # 读取文件 df1 = pd.read_pickle('df1.pickle') with open('df2.pickle','rb') as f: df2 = pickle.load(f) # 验证数据一致性 if (df1 == df2).all().all(): print('Data is ok.') # 交叉读取验证 df3 = pd.read_pickle('df2.pickle') with open('df1.pickle','rb') as f: df4 = pickle.load(f) # 验证交叉读取的数据一致性 if (df3 == df4).all().all(): print('Data opposite is ok.')
测试结果
Data is ok. Data opposite is ok.
文件大小差异
测试发现两种方式生成的pickle文件大小存在明显差异:
-rw-rw-r-- 1 spasz spasz 694 lis 15 17:38 df1.pickle -rw-rw-r-- 1 spasz spasz 662 lis 15 17:38 df2.pickle
测试环境:Python 3.8.0、pandas 1.5.0
核心差异解析
数据一致性与兼容性
两种方式保存的文件可以互相读取,且恢复后的DataFrame数据完全一致。这是因为pandas.to_pickle本质基于Python标准库pickle实现,只是做了适配pandas对象的封装。文件大小差异原因
pandas.to_pickle生成的文件更大,是因为它会额外存储pandas特定元数据,比如pandas版本信息、DataFrame的结构细节(索引类型、列数据类型定义、对象内部属性等),这些信息能确保后续读取时精准还原DataFrame的原始结构。而直接用pickle.dump仅序列化整个DataFrame对象,存储信息更紧凑。使用场景建议
- 临时保存DataFrame、追求文件体积紧凑时,可直接用
pickle.dump; - 长期保存或需要确保DataFrame完整结构(如自定义索引、类别型列、扩展数据类型等)精准还原时,推荐用
pandas.to_pickle配合pd.read_pickle,它更适配pandas对象的序列化逻辑。
- 临时保存DataFrame、追求文件体积紧凑时,可直接用
内容的提问来源于stack exchange,提问作者s.paszko
相关产品推荐
相关产品推荐

