Pandas to_hdf
成功,但当我使用自定义对象作为列标题时read_hdf
失败(我使用自定义对象,因为我需要在其中存储其他信息)。
有没有办法让这项工作?或者这只是一个Pandas bug或PyTables bug?
例如,下面,我将首先展示使用字符串列标题的DataFrame 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
更新:
所以杰夫回答(a)&#34;这不受支持&#34; (b)&#34;如果您有元数据,则将其写入属性&#34;。
关于(a)的问题1: 我的列标题对象具有返回其属性等的方法。例如,而不是列标题字符串&#39; x5y3z8&#39;我必须解析值,我可以简单地做col_header.x(给5)col_header.y(给3)等。这是非常面向对象和pythonic,而不是使用字符串来存储信息,不得不每次解析它来检索信息。你如何建议我以一种很好的方式替换我当前的列标题对象(也支持)?
(顺便说一句,你可能会看到&#39; x5y3z8&#39;并认为层次结构索引有效,但事实并非如此,因为不是每个列标题都是&#39; x#y#z#&#39;我可能有一个字符串foo&#39;字符串,另一个&#39; bar5baz7&#39;和另一个&#39; x5y3z8&#39;的浮点数。列标题不是&#39;制服。)
关于(a)的问题2: 当你说它不受支持时,你是否专门谈论to_hdf / read_hdf不支持它,或者你实际上是在说Pandas一般不支持它吗?如果它只缺少HDF5支持,那么我可以切换到另一种将DataFrame保存到磁盘的方式并使其工作,对吧?你预见到将来有什么问题吗?例如,这会打破to_pickle / read_pickle吗? (我失去了表现,但却放弃了一些东西,对吗?)
关于(b)的问题3: 你是什么意思&#34;如果你有元数据然后把它写到属性&#34;。属性是什么?一个简单的例子对我有很大帮助。我对熊猫来说很陌生。谢谢!
答案 0 :(得分:0)
这不是受支持的功能。
对于format='table'
,这将在下一版本的pandas(写作中)中提出。也应该fixed
,但是没有实现。这根本不受支持,也不可能。你应该只使用字符串。如果您有元数据,则将其写入属性。