2015-08-31 29 views
1

熊貓to_hdf成功,但然後read_hdf失敗時,我使用自定義對象作爲列標題(我使用自定義對象,因爲我需要在其中存儲其他信息)。熊貓to_hdf成功,但然後read_hdf失敗

有什麼方法可以使這項工作?或者這只是一個熊貓錯誤或PyTables錯誤?

舉個例子,下面,我將展示第一製造數據幀foo使用字符串列標題,一切工作正常to_hdf/read_hdf,但後來改變FOO使用自定義Col類列標題,to_hdf仍然有效不錯,但隨後read_hdf引發斷言錯誤:

In [48]: foo = pd.DataFrame(np.random.randn(2, 3), columns = ['aaa', 'bbb', 'ccc']) 

In [49]: foo 
Out[49]: 
    aaa  bbb  ccc 
0 -0.434303 0.174689 1.373971 
1 -0.562228 0.862092 -1.361979 

In [50]: foo.to_hdf('foo.h5', 'foo') 

In [51]: bar = pd.read_hdf('foo.h5', 'foo') 

In [52]: bar 
Out[52]: 
    aaa  bbb  ccc 
0 -0.434303 0.174689 1.373971 
1 -0.562228 0.862092 -1.361979 

In [52]: 

In [53]: class Col(object): 
...:  def __init__(self, name, other_info): 
...:   self.name = name 
...:   self.other_info = other_info 
...:  def __str__(self): 
...:   return self.name 
...:  

In [54]: foo = pd.DataFrame(np.random.randn(2, 3), columns = [Col('aaa', {'z': 5}), Col('bbb', {'y': True}), Col('ccc', {})]) 

In [55]: foo 
Out[55]: 
    aaa  bbb  ccc 
0 -0.830503 1.066178 1.057349 
1 0.406967 -0.131430 1.970204 

In [56]: foo.to_hdf('foo.h5', 'foo') 

In [57]: bar = pd.read_hdf('foo.h5', 'foo') 
--------------------------------------------------------------------------- 
AssertionError       Traceback (most recent call last) 
<ipython-input-57-888b061a1d2c> in <module>() 
----> 1 bar = pd.read_hdf('foo.h5', 'foo') 

/.../python3.4/site-packages/pandas/io/pytables.py in read_hdf(path_or_buf, key, **kwargs) 
330 
331  try: 
--> 332   return store.select(key, auto_close=auto_close, **kwargs) 
333  except: 
334   # if there is an error, close the store 

/.../python3.4/site-packages/pandas/io/pytables.py in select(self, key, where, start, stop, columns, iterator, chunksize, auto_close, **kwargs) 
672       auto_close=auto_close) 
673 
--> 674   return it.get_result() 
675 
676  def select_as_coordinates(

/.../python3.4/site-packages/pandas/io/pytables.py in get_result(self, coordinates) 
    1366 
    1367   # directly return the result 
-> 1368   results = self.func(self.start, self.stop, where) 
    1369   self.close() 
    1370   return results 

/.../python3.4/site-packages/pandas/io/pytables.py in func(_start, _stop, _where) 
665    return s.read(start=_start, stop=_stop, 
666       where=_where, 
--> 667       columns=columns, **kwargs) 
668 
669   # create the iterator 

/.../python3.4/site-packages/pandas/io/pytables.py in read(self, **kwargs) 
    2792    blocks.append(blk) 
    2793 
-> 2794   return self.obj_type(BlockManager(blocks, axes)) 
    2795 
    2796  def write(self, obj, **kwargs): 

/.../python3.4/site-packages/pandas/core/internals.py in __init__(self, blocks, axes, do_integrity_check, fastpath) 
    2180   self._consolidate_check() 
    2181 
-> 2182   self._rebuild_blknos_and_blklocs() 
    2183 
    2184  def make_empty(self, axes=None): 

/.../python3.4/site-packages/pandas/core/internals.py in _rebuild_blknos_and_blklocs(self) 
    2271 
    2272   if (new_blknos == -1).any(): 
-> 2273    raise AssertionError("Gaps in blk ref_locs") 
    2274 
    2275   self._blknos = new_blknos 

AssertionError: Gaps in blk ref_locs 

UPDATE

所以傑夫回答(一) 「這是不支持」 及(b)「如果y你有元數據然後寫入屬性「。

關於(a)的問題1: 我的列標題對象有返回它們的屬性等的方法。例如,我可以簡單地代替列標題字符串'x5y3z8'來解析這些值做col_header.x(給5)col_header.y(給3)等。這是非常面向對象和pythonic,而不是使用字符串來存儲信息,每次都必須解析它以檢索信息。你如何建議我以一種很好的方式替換當前的列標題對象(這也支持)? (可能你看'x5y3z8'並認爲分層索引有效,但事實並非如此,因爲不是每個列標題都是'x#y#z#'。我可能有一列'foo' (a): 問題2關於(a): 當你說它不被支持,你是否具體說話關於to_hdf/read_hdf不支持它,或者你是否實際上說熊貓一般不支持它?如果只是缺少HDF5支持,那麼我可以切換到其他方式將DataFrame保存到磁盤並使其正常工作,對吧?你預計未來會有什麼問題嗎?例如,這會打破to_pickle/read_pickle嗎? (我失去了表現,但放棄了一些東西,對吧?)

問題3關於(b): 你是什麼意思?如果你有元數據然後寫入屬性。什麼屬性?一個簡單的例子會幫助我很多。我對熊貓很新。謝謝!

回答

0

這不是支持的功能。

這將在下一個版本的熊貓(寫作時),format='table'。應該爲fixed以及,但沒有實現。這根本不被支持,也不可能。你應該只使用字符串。如果您有元數據,然後將其寫入屬性。

+0

添加了一些後續問題,如果你不介意回答他們。謝謝。 – aiai

+0

已閱讀文檔:http://pandas.pydata.org/pandas-docs/stable/io.html#hdf5-pytables然後閱讀PyTables本身。這不是關於Python,而是磁盤上定義的格式。有很多選擇,你必須弄清楚什麼是最適合你的情況。 – Jeff

+0

當你說它不被支持,你是否具體談論to_hdf/read_hdf不支持它,或者你是否實際上說熊貓一般不支持它?如果只是缺少HDF5支持,那麼我可以切換到to_pickle/read_pickle之類的東西。你預計未來會有什麼問題嗎?這會在未來破滅嗎? – aiai