存储由数据帧构成的字典的最有效方式是什么?

5

我有一个包含数据框的字典。

dictionary = {"key1": df1,
              "key2": df2, and so on...}

一些stackoverflow的帖子和reddit建议使用Json模块和pickle模块。

哪种方式最有效?为什么?

当我将小字典转换为pickle时,它的内存小于0kb,并呈现EOFError:Ran out of input,这在这里得到解释Why do I get "Pickle - EOFError: Ran out of input" reading an empty file?


使用pickle。您可能无法在JSON中存储数据框的所有可能数据。 - luigigi
jsonpickle 是另一种选择。 - misantroop
2个回答

4
我建议在更喜欢压缩文件格式时使用pickle。
# import packages
import pandas as pd
import numpy as np
import pickle
import os

# create dictionary of dataframes
nrows, ncols, ndataframes = 1_000, 50, 100
my_dict = {k:v for (k,v) in [[f'df_{n}', pd.DataFrame(np.random.rand(nrows, ncols))] for n in range(ndataframes)]}

# save dictionary as pickle file
pickle_out = open('my_dict.pickle', 'wb')
pickle.dump(my_dict, pickle_out)
pickle_out.close()

# create new dictionary from pickle file
pickle_in = open('my_dict.pickle', 'rb')
new_dict = pickle.load(pickle_in)

# print file size
print('File size pickle file is', round(os.path.getsize('my_dict.pickle') / (1024**2), 1), 'MB')

# sample
new_dict['df_10'].iloc[:5, :5]

结果:

文件大小为38.2 MB的pickle文件

          0         1         2         3         4
0  0.338838  0.501158  0.406240  0.693233  0.567305
1  0.092142  0.569312  0.952694  0.083705  0.006950
2  0.684314  0.373091  0.550300  0.391419  0.877889
3  0.117929  0.597653  0.726894  0.763094  0.466603
4  0.530755  0.472033  0.553457  0.863435  0.906389

谢谢!我正在测试小字典,但是当在 new_dict = pickle.load(pickle_in) 时出现了 EOFError: Ran out of input。 - haneulkim
你能否检查一下你的pickle文件是否成功写入磁盘(并且文件大小大于0字节)? - René
当你可以分享你的代码时,我会看一下。在我的回答中的代码在我的机器上使用Python 3.6.9运行没有问题。 - René
我刚刚创建了两个包含3行的数据框。尽管它有两个3x5的数据框,但大小为0kb。 - haneulkim
能否将你的代码添加到问题中。我怀疑读取pickle文件失败是因为pickle文件保存不成功。 - René
我刚刚在pickle_out.close后忘记了括号。谢谢你的帮助。 - haneulkim

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接