关于python:Pickle无法保存数据帧

Pickle not able to save dataframes

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

1
2
3
4
5
6
7
8
9
10
11
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

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

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

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

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

这是我得到的错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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


在没有一些测试代码和版本号的情况下,我唯一能看到的是你正在使用pandas.Dataframe对象。 这些人经常需要一些内置pandas内置酸洗方法的特殊处理。 我相信pandas同时提供to_picklesave方法,它们为Dataframe提供酸洗。 请参阅:如何使用PANDAS,Python存储数据框
和内部的链接。

并且,根据您尝试腌制的Dataframe的大小以及依赖项的版本,它可能会遇到64位的酸洗错误。 请参阅:腌制数据框架。

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