24

Pandas有以下示例说明如何在 HDF5 文件中存储Series,DataFrames和:Panels

准备一些数据:

In [1142]: store = HDFStore('store.h5')

In [1143]: index = date_range('1/1/2000', periods=8)

In [1144]: s = Series(randn(5), index=['a', 'b', 'c', 'd', 'e'])

In [1145]: df = DataFrame(randn(8, 3), index=index,
   ......:                columns=['A', 'B', 'C'])
   ......:

In [1146]: wp = Panel(randn(2, 5, 4), items=['Item1', 'Item2'],
   ......:            major_axis=date_range('1/1/2000', periods=5),
   ......:            minor_axis=['A', 'B', 'C', 'D'])
   ......:

将其保存在商店中:

In [1147]: store['s'] = s

In [1148]: store['df'] = df

In [1149]: store['wp'] = wp

检查商店里的东西:

In [1150]: store
Out[1150]: 
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/df            frame        (shape->[8,3])  
/s             series       (shape->[5])    
/wp            wide         (shape->[2,5,4])

关闭商店:

In [1151]: store.close()

问题:

  1. 在上面的代码中,数据是什么时候真正写入磁盘的

  2. 假设我想将数千个存在于.csv文件中的大型数据框添加到单个.h5文件中。我需要加载它们并将它们.h5一一添加到文件中,因为我不能一次将它们全部存储在内存中,因为它们会占用太多内存。HDF5可以做到这一点吗?正确的方法是什么?

  3. Pandas 文档说明如下:

    “这些存储一旦写入就不可追加(尽管您只需将它们删除并重写)。它们也不可查询;它们必须全部检索。”

    不可附加也不可查询是什么意思?另外,它不应该说一次关闭而不是吗?

4

2 回答 2

15
  1. 一旦执行该语句,例如store['df'] = df. 只是关闭实际文件(close如果进程存在,它将为您关闭,但会打印一条警告消息)

  2. 阅读http://pandas.pydata.org/pandas-docs/dev/io.html#storing-in-table-format部分

    .h5在一个文件中放置大量节点通常不是一个好主意。您可能想要追加并创建较少数量的节点。

    您可以一一迭代您.csv和它们。store/append就像是:

    for f in files:
      df = pd.read_csv(f)
      df.to_hdf('file.h5',f,df)
    

    将是一种方式(为每个文件创建一个单独的节点)

  3. 不可附加 - 一旦你写了它,你只能一次检索它,例如你不能选择一个子部分

    如果您有一张桌子,那么您可以执行以下操作:

    pd.read_hdf('my_store.h5','a_table_node',['index>100'])
    

    这就像一个数据库查询,只获取部分数据

    因此,存储既不可追加,也不可查询,而表既是.

于 2013-05-19T17:43:49.743 回答
4

回答问题 2,使用 pandas 0.18.0 您可以:

store = pd.HDFStore('compiled_measurements.h5')
for filepath in file_iterator:
    raw = pd.read_csv(filepath)
    store.append('measurements', raw, index=False)

store.create_table_index('measurements', columns=['a', 'b', 'c'], optlevel=9, kind='full')
store.close()

基于文档的这一部分。

根据您拥有的数据量,创建索引可能会消耗大量内存。PyTables 文档描述了optlevel的值。

于 2016-08-16T13:34:15.950 回答