首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫to_hdf成功,但read_hdf失败

熊猫to_hdf成功,但read_hdf失败
EN

Stack Overflow用户
提问于 2015-08-31 19:18:48
回答 1查看 2.7K关注 0票数 1

熊猫to_hdf成功了,但是当我使用自定义对象作为列标题时,read_hdf失败了(我使用自定义对象,因为我需要在它们中存储其他信息)。

有什么办法让这件事成功吗?或者这只是Pandas的bug还是PyTables的bug?

作为一个示例,下面我将展示如何首先制作一个使用string列标题的DataFrame foo,并且在to_hdf/read_hdf中一切正常工作,但是然后更改foo以使用自定义的Col类作为列标题,to_hdf仍然工作正常,但是read_hdf会引发断言错误:

代码语言:javascript
复制
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

更新

因此Jeff回答(a)“这不受支持”和(b)“如果您有元数据,那么将其写入属性”。

问题1关于(a):我的列标题对象有返回它们属性的方法等等。例如,与必须解析值的列标题字符串“x5y3z8”不同,我可以简单地执行col_header.x (gives 5) col_header.y (gives 3)等操作。这是非常面向对象和奏鸣曲的,而不是使用字符串来存储信息,每次都必须解析它来检索信息。如何建议我以一种很好的方式替换当前的列标题对象(这也是受支持的)?

(顺便说一句,您可能会看到'x5y3z8‘,并认为分层索引是有效的,但事实并非如此,因为不是每个列标题都是'x#y#z#’。我可能有一列'foo‘的字符串,另一个'bar5baz7’的国家,另一个'x5y3z8‘的浮动。列标题不统一。)

问题2关于(a):当你说它不被支持的时候,你是在具体地谈论_hdf/read_hdf不支持它,还是说Pandas在总体上不支持它?如果缺少的只是HDF5支持,那么我可以切换到将DataFrames保存到磁盘的其他方法,使其正常工作,对吗?你预见到将来会有什么问题吗?例如,这会与to_泡菜/读泡菜决裂吗?(我失去了表演,但不得不放弃一些东西,对吗?)

关于(B)的问题3:你所说的“如果你有元数据,然后把它写到属性”是什么意思。什么属性?一个简单的例子对我有很大的帮助。我对潘达斯很陌生。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-08-31 19:42:32

这不是一个受支持的特性。

这将在下一个版本的熊猫(正在写作),为format='table'。也应该适用于fixed,但还没有实现。这一点根本不受支持,也不太可能得到支持。你应该用字符串。如果您有元数据,那么将其写入属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32318412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档