我有一个带有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文件中。我无法在互联网上找到解决方案。
答案 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将所有东西粘合在一起。
我同意这是一种软糖并且不是最理想的。如果有人可以推荐一个适当的"回答我有兴趣看到它,但我认为这很简单,因为数据帧不应超过一定的大小。
答案 2 :(得分:2)
尝试使用压缩。它对我有用。
data_df.to_pickle('data_df.pickle.gzde', compression='gzip')
答案 3 :(得分:0)
我遇到了同样的问题,并将原因归结为内存问题。根据{{3}},它通常实际上不是由内存本身引起的,而是将过多的资源移入交换空间。通过禁用与命令(在该链接中提供)一起全部交换,我能够保存大熊猫文件:
swapoff -a