【问题标题】:Storing multiple objects in an HDFStore group在 HDFStore 组中存储多个对象
【发布时间】:2016-10-31 01:55:05
【问题描述】:

我想在一个 HDFStore 中存储多个对象,但我想通过分组来组织它。大致如下:

import pandas as pd
my_store = pd.HDFStore('my_local_store.h5')
my_store._handle.createGroup('/', 'data_source_1') # this works, but I'm not sure what it does
my_store['/data_source_1']['part-1'] = pd.DataFrame({'b':[1,2,9,2,3,5,2,5]}) # this does not work
my_store['/data_source_1']['part-2'] = pd.DataFrame({'b':[3,8,4,2,5,5,6,1]}) # this does not work either

【问题讨论】:

    标签: python pandas hdf5 hdfstore


    【解决方案1】:

    试试这个:

    my_store['/data_source_1/part-1'] = ...
    

    演示:

    In [13]: store = pd.HDFStore('c:/temp/stocks.h5')
    
    In [15]: store['/aaa/bbb'] = df
    
    In [17]: store.groups
    Out[17]:
    <bound method HDFStore.groups of <class 'pandas.io.pytables.HDFStore'>
    File path: c:/temp/stocks.h5
    /aaa/bbb            frame        (shape->[3,7])
    /stocks             wide_table   (typ->appendable,nrows->6,ncols->3,indexers->[major_axis,minor_axis],dc->[AAPL,ABC,GOOG])>
    
    In [18]: store['/aaa/bbb2'] = df
    
    In [20]: store.items
    Out[20]:
    <bound method HDFStore.items of <class 'pandas.io.pytables.HDFStore'>
    File path: c:/temp/stocks.h5
    /aaa/bbb             frame        (shape->[3,7])
    /aaa/bbb2            frame        (shape->[3,7])
    /stocks              wide_table   (typ->appendable,nrows->6,ncols->3,indexers->[major_axis,minor_axis],dc->[AAPL,ABC,GOOG])>
    

    更新:

    In [29]: store.get_node('/aaa')
    Out[29]:
    /aaa (Group) ''
      children := ['bbb' (Group), 'bbb2' (Group)]
    

    PS AFAIK Pandas 将 key (/aaa/bbb) 视为完整路径

    UPDATE2:列出商店:

    我们有以下商店:

    In [19]: store
    Out[19]:
    <class 'pandas.io.pytables.HDFStore'>
    File path: D:\temp\.data\hdf\test_groups.h5
    /data_source_1/subdir1/1            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index])
    /data_source_1/subdir1/2            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index])
    /data_source_1/subdir1/3            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index])
    /data_source_1/subdir1/4            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index])
    /data_source_1/subdir1/5            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index])
    /data_source_1/subdir2/1            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index],dc->[a,b,c])
    /data_source_1/subdir2/2            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index],dc->[a,b,c])
    /data_source_1/subdir2/3            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index],dc->[a,b,c])
    /data_source_1/subdir2/4            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index],dc->[a,b,c])
    /data_source_1/subdir2/5            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index],dc->[a,b,c])
    /data_source_1/subdir2/6            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index],dc->[a,b,c])
    /data_source_1/subdir2/7            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index],dc->[a,b,c])
    /data_source_1/subdir2/8            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index],dc->[a,b,c])
    /data_source_1/subdir2/9            frame_table  (typ->appendable,nrows->10,ncols->3,indexers->[index],dc->[a,b,c])
    

    让我们找到/data_source_1/subdir2中的所有条目:

    In [20]: [s for s in store if s.startswith('/data_source_1/subdir2/')]
    Out[20]:
    ['/data_source_1/subdir2/1',
     '/data_source_1/subdir2/2',
     '/data_source_1/subdir2/3',
     '/data_source_1/subdir2/4',
     '/data_source_1/subdir2/5',
     '/data_source_1/subdir2/6',
     '/data_source_1/subdir2/7',
     '/data_source_1/subdir2/8',
     '/data_source_1/subdir2/9']
    

    并且拥有可以轻松选择数据的键:

    In [25]: dfs = [store.select(s, where='a > 5') for s in store if s.startswith('/data_source_1/subdir2/')]
    
    In [26]: [len(df) for df in dfs]
    Out[26]: [5, 5, 5, 5, 5, 5, 5, 5, 5]
    
    In [29]: dfs = [store.select(s, where='a > 7') for s in store if s.startswith('/data_source_1/subdir2/')]
    
    In [30]: [len(df) for df in dfs]
    Out[30]: [4, 4, 4, 4, 4, 4, 4, 4, 4]
    

    【讨论】:

    • 我如何列出组 'aaa' 中的所有元素?
    • @mgoldwasser,请查看更新 - 这就是您要找的吗?
    • 这很有帮助 - 如果我想遍历孩子们,我想我可以做这样的事情 [my_store.get('/data_source_1/' + child) for child in my_store.get_node('/data_source_1')._v_children.keys()] 但也许有更好的方法......
    • @mgoldwasser,我认为可以更轻松地完成 - 请参阅 UPDATE2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2017-11-28
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多