Pickle无法保存数据帧

时间:2014-11-28 13:02:31

标签: python ipython pickle ipython-notebook jsonpickle

我正在尝试使用pickle来保存我通过其他数据集生成的少量大型数据集。虽然转储它并没有给我任何错误但是当我尝试加载这些数据集pickle退出时出现eof错误。下面是我为保存数据集而运行的代码:

from scipy.stats.mstats import mode
trainingSetCustomers = pd.DataFrame({'visitFrequency': trainingSet.size(),'totalAmountSpent': trainingSet['amountSpent'].sum(),'totalProducts': trainingSet['productCount'].sum(),'firstVisit': trainingSet['visitDate'].min(),'lastVisit': trainingSet['visitDate'].max(),'visitType':trainingSet['visitType'].apply(f),'country': trainingSet['country'].apply(f),'isReferred':trainingSet['isReferred'].sum()}).reset_index()
p2 = pickle.Pickler(open("trainingSetCustomers.p","wb")) #finaldatasetYear1AndYear2 #trainingset groupedCustomersWithDates dfOrdersNew groupedCustomersNew
p2.clear_memo()
p2.dump(trainingSetCustomers)
print "Training Set saved" #Done
trainingResultSetCustomers = pd.DataFrame({'futureVisitFrequency': trainingResultSet.size(),'futureTotalAmountSpent': trainingResultSet['amountSpent'].sum(),'futureTotalProducts': trainingResultSet['productCount'].sum(),'firstVisit': trainingResultSet['visitDate'].min(),'lastVisit': trainingResultSet['visitDate'].max(),'visitType':trainingResultSet['visitType'].apply(f),'country': trainingResultSet['country'].apply(f),'isReferred':trainingResultSet['isReferred'].sum()}).reset_index()
p3 = pickle.Pickler(open("trainingResultSetCustomers.p","wb")) #finaldatasetYear1AndYear2 #trainingset groupedCustomersWithDates dfOrdersNew groupedCustomersNew
p3.clear_memo()
p3.dump(trainingResultSetCustomers)
print "trainingresult set saved" #Done

此操作没有任何错误并打印消息。 但是当我运行以下代码时:

trainingResultSetCustomers = pickle.load( open( "trainingResultSetCustomers.p", "rb" ) )

它给了我一个EoFError。我需要存储4种这样的测试集,我真的很困惑,为什么会发生这种情况。如果这有任何区别,我通过ssh在IPython笔记本上运行它。 此外,如果我只用5行尝试它,它可以很好地工作

数据结构:从代码中可以看出,此数据框是由分组对象的属性生成的。

这是我得到的错误:

EOFError                                  Traceback (most recent call last)
<ipython-input-10-86d38895c564> in <module>()
      5 p = pickle.Pickler(o) #finaldatasetYear1AndYear2 #trainingset groupedCustomersWithDates dfOrdersNew groupedCustomersNew
      6 p.clear_memo()
----> 7 trainingset = pickle.load(o)
      8 o.close()
      9 print "done"

/usr/lib/python2.7/pickle.pyc in load(file)
   1376 
   1377 def load(file):
-> 1378     return Unpickler(file).load()
   1379 
   1380 def loads(str):

/usr/lib/python2.7/pickle.pyc in load(self)
    856             while 1:
    857                 key = read(1)
--> 858                 dispatch[key](self)
    859         except _Stop, stopinst:
    860             return stopinst.value

/usr/lib/python2.7/pickle.pyc in load_eof(self)
    878 
    879     def load_eof(self):
--> 880         raise EOFError
    881     dispatch[''] = load_eof
    882 

1 个答案:

答案 0 :(得分:0)

如果没有一些测试代码和版本号,我唯一能看到的就是你正在使用pandas.Dataframe个对象。这些人经常需要一些内置于pandas内置酸洗方法的特殊处理。我相信pandas同时提供to_picklesave方法,它们为Dataframe提供酸洗。请参阅:How to store data frame using PANDAS, Python 和内部的链接。

而且,根据您试图挑选的Dataframe的大小以及依赖项的版本,它可能会遇到64位的酸洗错误。请参阅:Pickling a DataFrame

此外,如果您通过ssh发送序列化数据,您可能需要检查您是否遇到某种ssh数据包限制。如果您只是通过ssh执行代码,那么这不应该是一个潜在的问题。