【问题标题】:save multiple pd.DataFrames with hierarchy to hdf5将多个具有层次结构的 pd.DataFrames 保存到 hdf5
【发布时间】:2018-06-18 18:20:09
【问题描述】:

我有多个具有分层组织的 pd.DataFrames。假设我有:

day_temperature_london_df = pd.DataFrame(...)
night_temperature_london_df = pd.DataFrame(...)

day_temperature_paris_df = pd.DataFrame(...)
night_temperature_paris_df = pd.DataFrame(...)

我想将它们分组到 hdf5 文件中,因此其中两个进入组“伦敦”,另外两个进入组“巴黎”。

如果我使用 h5py,我会丢失 pd.DataFrame 的格式,丢失索引和列。

f = h5py.File("temperature.h5", "w")
grp_london = f.create_group("london")
day_lon_dset = grp_london.create_dataset("day", data=day_temperature_london_df)
print day_lon_dset[...]

这给了我一个 numpy 数组。有没有办法以与.to_hdf 相同的方式存储许多具有层次结构的数据帧 - 它保留数据帧的所有属性?

【问题讨论】:

  • h5py 保存 numpy 数组。 pandas 有自己的方法来保存整个数据帧。我认为它使用pytables 而不是h5py,尽管可以使用h5py 读取生成的文件。实际上,它将数据帧值和索引保存为某种组中的单独数组。我在前面的 SO 问题中探讨了这种结构。
  • HDFStorepandas.pydata.org/pandas-docs/stable/cookbook.html#cookbook-hdf 可能会为您提供存储 pandas 对象的最大能力。我可以用group/df2', but I can't (so far) create or load just a group`之类的复合键来存储东西。
  • @hpaulj 是的,这就是问题所在 - 我可以创建“组/df”,但不能只调用“组”。此外,通过使用同一组(出于某种原因)编写多个键,它使用的磁盘空间量增加了一倍以上

标签: python pandas numpy hdf5 h5py


【解决方案1】:

我将把答案、cmets 和我在其他页面上找到的内容合并到这个答案中。

所以是的,在我的情况下确实不需要 h5py。可以通过

创建组
import pandas as pd 
s = pd.HDFStore(test.h5')
s['london/day'] = day_temperature_london_df
s['london/night'] = night_temperature_london_df

每个DataFrame都可以通过以下方式访问:

pd.read_hdf('test.h5', 'london/day')

但是不清楚如何只阅读一组。这可以通过循环一个节点来完成,例如:

s = pd.HDFStore('test.h5')
[s.select(node._v_pathname) for node in s.get_node('london')]

在这种情况下,列表的每个元素都成为节点“伦敦”的数据帧

调用s可以查看文件结构

<class 'pandas.io.pytables.HDFStore'>
File path: store_5.h5
/london/day              frame        (shape->[100,2])
/london/night            frame        (shape->[200,1])

因此,通过这种方式,您应该能够使用 DataFrame 创建多个级别,并且能够在不丢失列、索引等的情况下将它们读回。

【讨论】:

    【解决方案2】:

    我对@9​​87654322@ 和h5pypandas 更熟悉。但我能够创造:

    In [85]: store = pd.HDFStore('store.h5')
    In [86]: store.root
    Out[86]: 
    / (RootGroup) ''
      children := []
    In [87]: store['df1']=df1
    In [88]: store['group/df1']=df1
    In [89]: store['group/df2']=df2
    

    可以重新加载和查看:

    In [95]: store
    Out[95]: 
    <class 'pandas.io.pytables.HDFStore'>
    File path: store.h5
    /df1                  frame        (shape->[3,4])
    /group/df1            frame        (shape->[3,4])
    /group/df2            frame        (shape->[5,6])
    
    In [96]: store.root
    Out[96]: 
    / (RootGroup) ''
      children := ['df1' (Group), 'group' (Group)]
    

    store._handle 详细显示了文件结构。

    在 shell 中,我还可以使用以下命令查看文件:

    1431:~/mypy$ h5dump store.h5 |less
    

    以下:

    how should i use h5py lib for storing time series data

    In [4]: f1 = h5py.File('store.h5')
    In [5]: list(f1.keys())
    Out[5]: ['df1', 'group']
    In [6]: list(f1['df1'].keys())
    Out[6]: ['axis0', 'axis1', 'block0_items', 'block0_values']
    
    In [10]: list(f1['group'].keys())
    Out[10]: ['df1', 'df2']
    In [11]: list(f1['group/df1'].keys())
    Out[11]: ['axis0', 'axis1', 'block0_items', 'block0_values']
    In [12]: list(f1['group/df2'].keys())
    Out[12]: ['axis0', 'axis1', 'block0_items', 'block0_values']
    

    所以 `group/df2' 键相当于组的层次结构:

    In [13]: gp = f1['group']
    In [15]: gp['df2']['axis0']
    Out[15]: <HDF5 dataset "axis0": shape (6,), type "<i8">
    [17]: f1['group/df2/axis0']
    Out[17]: <HDF5 dataset "axis0": shape (6,), type "<i8">
    

    我们必须深入挖掘 HDFStorePytables 的文档或代码,看看它们是否有 create_group 的等价物。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      相关资源
      最近更新 更多