如何在HDF5Store中读写子组?

1 投票
1 回答
701 浏览
提问于 2025-04-18 16:00

我正在使用HDF5Store来存储一些处理后的结果,以便进行分析。

我想在这个存储中放入三种类型的结果:

  • 原始结果,这些结果完全没有处理,只是从原始的CSV格式中读取并合并过来。
  • 处理过的结果,这些结果是从原始结果中得来的,经过了一些处理,并且分成了更合理的组。
  • 总结结果,这些结果添加了一些有用的总结列,并去掉了一些冗余的列,以便于阅读。

我想用一个带有层级键的HDF5Store来实现这个,分别为原始结果、处理结果和总结结果各设置一个。

我希望结构像这样:

<class 'pandas.io.pytables.HDFStore'>
File path: results.h5
/proccessed/dbn_reinit                           frame        (shape->[22880,19])
/proccessed/dbn_rerep_code                       frame        (shape->[11440,18])
/proccessed/dbn_rerep_enhanced_input             frame        (shape->[11440,18])
/proccessed/linear_classifier                    frame        (shape->[572,18])  
/proccessed/msda_rerep_code                      frame        (shape->[18304,17])
/proccessed/msda_rerep_enhanced_input            frame        (shape->[18304,17])
/raw/dbn_reinit                                  frame        (shape->[22880,15])
/raw/dbn_rerep                                   frame        (shape->[23452,15])
/raw/msda_rerep                                  frame        (shape->[36608,14])
/summerised/dbn_reinit                           frame        (shape->[22880,10])
/summerised/dbn_rerep_code                       frame        (shape->[11440,9]) 
/summerised/dbn_rerep_enhanced_input             frame        (shape->[11440,9]) 
/summerised/linear_classifier                    frame        (shape->[572,6])   
/summerised/msda_rerep_code                      frame        (shape->[18304,10])
/summerised/msda_rerep_enhanced_input            frame        (shape->[18304,10])

我本以为可以通过以下方式来创建:

store = pandas.HDF5Store('results.h5')
store.add_group('raw')
raw_store = store['raw'] 
raw_store['dbn_reinit'] = dbn_reinit_dataframe
raw_store['dbn_rerep_code'] = dbn_rerep_code_dataframe
...

等等

但是似乎没有办法获取存储中的子组,并把它当作一个独立的存储来使用。

所以我不得不这样做:

store = pd.HDFStore('results.h5', mode='w')

store['raw/dbn_reinit'] = dbn_reinit_dataframe
store['raw/dbn_rerep'] = dbn_reinit_dataframe
...

这样写起来比较繁琐,而且并没有很好地展示出这三类结果的分组。

我是不是漏掉了什么?还是说HDF的层级特性只是让键名变得很长,并且里面有/符号?

1 个回答

1

关于如何使用层级键的文档可以在这里找到。.remove()这个功能可以让你删除某一层级的节点以及更下面的节点。

你可以使用store.get_storer('foo')来获取一个对象,这个对象可以让你访问到某个节点(比如.group)。不过,这个对象不允许你添加或选择子节点,也不会提供这个节点的漂亮展示。

如果你想要这些功能,可以在github上提交一个功能请求。请附上一个可以复现的例子,说明你希望这个功能应该怎么工作。

欢迎提交拉取请求!

我很少使用多个组,主要是因为使用不同文件的灵活性。你想做的事情是可以实现的,只是我从来没有觉得有这个必要(比如把你的组当作文件本身)。HDF5并不是一个数据库,所以这通常不太有用。

撰写回答