【问题标题】:Read entire group in an HDF5 file using a pandas.HDFStore使用 pandas.HDFStore 读取 HDF5 文件中的整个组
【发布时间】:2014-05-18 19:42:33
【问题描述】:

我有一个这样的 HDF 文件:

>>> dataset.store
... <class 'pandas.io.pytables.HDFStore'>
... File path: ../data/data_experiments_01-02-03.h5
... /exp01/user01    frame_table  (typ->appendable,nrows->221,ncols->124,indexers->[index])
... /exp01/user02    frame_table  (typ->appendable,nrows->163,ncols->124,indexers->[index])
... /exp01/user03    frame_table  (typ->appendable,nrows->145,ncols->124,indexers->[index])
... /exp02/user01    frame_table  (typ->appendable,nrows->194,ncols->124,indexers->[index])
... /exp02/user02    frame_table  (typ->appendable,nrows->145,ncols->124,indexers->[index])
... /exp03/user03    frame_table  (typ->appendable,nrows->348,ncols->124,indexers->[index])
... /exp03/user01    frame_table  (typ->appendable,nrows->240,ncols->124,indexers->[index])

我想从其中一个实验 (exp0Z) 中检索所有用户 (userXY) 并将它们附加到单个大 DataFrame 中。我试过store.get('exp03')得到以下错误:

>>> store.get('exp03')
... 
... ---------------------------------------------------------------------------
... TypeError                                 Traceback (most recent call last)
... <ipython-input-109-0a2e29e9e0a4> in <module>()
... ----> 1 dataset.store.get('/exp03')
... 
... /Library/Python/2.7/site-packages/pandas/io/pytables.pyc in get(self, key)
...     613         if group is None:
...     614             raise KeyError('No object named %s in the file' % key)
... --> 615         return self._read_group(group)
...     616 
...     617     def select(self, key, where=None, start=None, stop=None, columns=None,
... 
... /Library/Python/2.7/site-packages/pandas/io/pytables.pyc in _read_group(self, group, **kwargs)
...    1277 
...    1278     def _read_group(self, group, **kwargs):
... -> 1279         s = self._create_storer(group)
...    1280         s.infer_axes()
...    1281         return s.read(**kwargs)
... 
... /Library/Python/2.7/site-packages/pandas/io/pytables.pyc in _create_storer(self, group, format, value, append, **kwargs)
...    1160                 else:
...    1161                     raise TypeError(
... -> 1162                         "cannot create a storer if the object is not existing "
...    1163                         "nor a value are passed")
...    1164             else:
... 
... TypeError: cannot create a storer if the object is not existing nor a value are passed

我可以通过调用store.get('exp03/user01') 来检索单个用户,所以我想可以迭代store.keys() 并手动附加检索到的数据帧,但我想知道是否可以在一次调用@ 时这样做987654326@或其他类似方法。

编辑:请注意,数据集是一个包含我的 pandas.HDFstore 的类

【问题讨论】:

    标签: python pandas hdfstore


    【解决方案1】:

    虽然这可能是一个不错的功能,但尚未实现。 (仅供参考,我不会在.get(...) 中默认设置它,因为它不够明确(例如,它是否应该总是读取所有表,太多猜测),但可以有一个参数来控制我想的哪些子表。如果你有兴趣实现这个,请放到github。

    您可以使用一些内部函数来简化此操作(您甚至可以将 where 传递给每个选择。

    In [13]: store = pd.HDFStore('test.h5',mode='w')
    
    In [14]: store.append('df/foo1',DataFrame(np.random.randn(10,2)))
    
    In [15]: store.append('df/foo2',DataFrame(np.random.randn(10,2)))
    
    In [16]: pd.concat([ store.select(node._v_pathname) for node in store.get_node('df') ])
    Out[16]: 
              0         1
    0 -0.495847 -1.449251
    1 -0.494721  1.572560
    2  1.219985  0.280878
    3 -0.419651  1.975562
    4 -0.489689 -2.712342
    5 -0.022466 -0.238129
    6 -1.195269 -0.028390
    7 -0.192648  1.220730
    8  1.331892  0.950508
    9 -0.790354 -0.743006
    0 -0.761820  0.847983
    1 -0.126829  1.304889
    2  0.667949 -1.481652
    3  0.030162 -0.111911
    4 -0.433762 -0.596412
    5 -1.110968  0.411241
    6 -0.428930  0.086527
    7 -0.866701 -1.286884
    8 -0.649420  0.227999
    9 -0.100669 -0.205232
    
    [20 rows x 2 columns]
    
    In [17]: store.close()
    

    请记住,如果我这样做,那么当数据相同时,他们没有理由拥有单独的节点;将它放在一个表中并说一个表示其名称或 ID 或其他内容的字段会更有效。

    我几乎总是对异构数据使用不同的节点(不需要不同的 dtype,而是不同的数据“类型”)。

    也就是说,你可以随心所欲地组织!

    【讨论】:

    • 谢谢@Jeff,我已经向 github 添加了一个issue,提出了这个新功能。
    猜你喜欢
    • 2015-05-09
    • 2014-10-04
    • 2017-06-27
    • 1970-01-01
    • 2017-06-26
    • 2015-03-19
    • 1970-01-01
    • 2016-02-10
    • 2017-09-24
    相关资源
    最近更新 更多