我想把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上进行了测试。
1条答案
按热度按时间nszi6y051#
在分析了
pickle
(python3.8)和pandas
1.5.0的模块代码之后,我有以下想法。保存/转储数据框以进行pickle
泡菜代码:
DEFAULT_PROTOCOL
。DEFAULT_PROTOCOL
(==4)不是HIGHEST_PROTOCOL
(==5)。Pandas代码:
HIGHEST_PROTOCOL
,正在从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模块函数。