Python Pandas to_pickle无法腌制大型数据帧

时间:2015-04-09 19:42:44

标签: python pandas pickle

我有一个带有500,000行的数据帧“DF”。以下是每列的数据类型:

ID      int64
time    datetime64[ns]
data    object

“data”列中的每个条目都是size = [5,500]

的数组

当我尝试使用

保存此数据框时
DF.to_pickle("my_filename.pkl")

它给我发了以下错误:

     12     """
     13     with open(path, 'wb') as f:
---> 14         pkl.dump(obj, f, protocol=pkl.HIGHEST_PROTOCOL) 

OSError: [Errno 22] Invalid argument

我也尝试这种方法,但我得到了同样的错误:

import pickle


with open('my_filename.pkl', 'wb') as f:
    pickle.dump(DF, f)

我尝试保存此数据帧的10行:

DF.head(10).to_pickle('test_save.pkl')

我根本没有错误。因此,它可以节省小DF而不是大DF。

我在Mac上使用python 3,ipython notebook 3.

请帮我解决这个问题。我真的需要将这个DF保存到pickle文件中。我无法在互联网上找到解决方案。

4 个答案:

答案 0 :(得分:10)

直到在pickle / pandas方面某处修复, 我说更好的选择是使用备用IO后端。 HDF适用于大型数据集(GB)。因此,您不需要添加额外的拆分/合并逻辑。

df.to_hdf('my_filename.hdf','mydata',mode='w')

df = pd.read_hdf('my_filename.hdf','mydata')

答案 1 :(得分:3)

可能不是你希望的答案,但这就是我所做的......

使用np.array_split将数据帧拆分为更小的块(尽管numpy函数不能保证工作,但现在确实如此,尽管曾经存在错误)。

然后挑选较小的数据帧。

当你去除它们时,使用pandas.append或pandas.concat将所有东西粘合在一起。

我同意这是一种软糖并且不是最理想的。如果有人可以推荐一个适当的"回答我有兴趣看到它,但我认为这很简单,因为数据帧不应超过一定的大小。

Split a large pandas dataframe

答案 2 :(得分:2)

尝试使用压缩。它对我有用。

data_df.to_pickle('data_df.pickle.gzde', compression='gzip')

答案 3 :(得分:0)

我遇到了同样的问题,并将原因归结为内存问题。根据{{​​3}},它通常实际上不是由内存本身引起的,而是将过多的资源移入交换空间。通过禁用与​​命令(在该链接中提供)一起全部交换,我能够保存大熊猫文件:

    swapoff -a