如何在HDF5Store中读写子组?
我正在使用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并不是一个数据库,所以这通常不太有用。