pandas 保存pd.toDataFrame时,panda www.example.com _pickle和pickle模块pickle.dump有什么区别?

t3psigkw  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(264)

我想把python pandas DataFrame对象保存为pickle。使用pandas.to_pickle和使用pickle.dumps有什么区别?
我做了一些测试。下面是我的测试代码:

import pandas as pd
import pickle
df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'), index=['x', 'y'])

# Save
df.to_pickle('df1.pickle')
with open('df2.pickle','wb') as f:
    pickle.dump(df, f)

# Load
df1 = pd.read_pickle('df1.pickle')
with open('df2.pickle','rb') as f:
    df2 = pickle.load(f)

# Is ok?
if (df1 == df2).all().all():
    print('Data is ok.')

# Load opposite
df3 = pd.read_pickle('df2.pickle')
with open('df1.pickle','rb') as f:
    df4 = pickle.load(f)

# Is ok?
if (df3 == df4).all().all():
    print('Data opposite is ok.')

结果:

Data is ok.
Data opposite is ok.

有什么不同吗?我看到一些不同的输出pickle文件大小。Pandas版本的文件更大。

-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和panda 1.5.0上进行了测试。

nszi6y05

nszi6y051#

在分析了pickle(python3.8)和pandas 1.5.0的模块代码之后,我有以下想法。

保存/转储数据框以进行pickle

泡菜代码:

  • 如果未指定,则默认使用pickle协议DEFAULT_PROTOCOLDEFAULT_PROTOCOL(==4)不是HIGHEST_PROTOCOL(==5)。

Pandas代码:

  • 默认使用pickle协议HIGHEST_PROTOCOL
  • 当保存pickle时,处理错误GH#39002,协议==5,压缩bz 2或xz,

正在从pickle阅读DataFrame

泡菜代码:

  • 没有什么重要的区别,

Pandas代码:

  • 默认使用对pickle.load()的直接调用
  • 捕获一些异常以处理在以前的pandas版本中写入的数据和python 2.7 unicode错误(请参见GH#28645和GH#31988)

我最后的想法
正如@DeepSpace所说,pands几乎直接调用pickle函数,如果你正在用当前的pandas版本创建新数据,而不是使用pickle protocol==5和bz 2/xz压缩,那么你可以安全地使用pickle模块函数。

相关问题