在Pandas中迭代地写入HDF5存储的数据

24

Pandas提供了以下示例,展示如何将SeriesDataFramesPanels存储到HDF5文件中:

准备一些数据:

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文档中说:

    "这些存储一旦写入就无法追加(虽然您可以简单地删除它们并重新编写)。它们也不可查询;必须检索其全部内容。"

    什么意思无法追加或查询?另外,它不应该说一旦关闭而不是写入吗?

2个回答

15
  1. 一旦语句被执行,例如store['df'] = dfclose 仅仅关闭实际文件(如果该进程已经关闭文件,则会为您关闭文件,但会打印警告消息)。

  2. 请阅读http://pandas.pydata.org/pandas-docs/dev/io.html#storing-in-table-format 章节。

    通常不建议在一个 .h5 文件中存储大量节点。您可能需要追加和创建较少的节点。

    您可以通过迭代遍历您的 .csv 并逐个使用 store/append 储存它们。例如:

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

    创建一个单独的节点来表示每个文件是一种方法。

  4. 不可追加 - 一旦您写入它,只能一次性检索全部内容,例如,您不能选择子部分。

    如果您有一个表格,则可以执行以下操作:

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

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

    因此,存储空间不可添加、也不可查询,而表格则两者皆可。


谢谢,我对你在2)的回答有些困惑。为什么要将 f 传递给 df.to_hdf?此外,df.to_hdfstore['df'] = df 之间有什么区别吗?最后,我对节点如何与上面的代码相关联感到困惑。store['df'] = df 是否一定会在文件中创建一个新节点?是否有办法将多个DataFrame添加到单个hdf5文件中的单个节点中? - Amelio Vazquez-Reina
2
节点名称为“f”,“store[f] = pd.read_csv(f)”等同于“df.to_hdf”,但“df.to_hdf”会自动为您打开/关闭存储。 “store ['df'] = df”创建/覆盖名为“'df'”的节点。请注意,不要一直这样做,参见有关删除数据的部分。一个节点只能容纳一个对象(例如框架),但如果需要,可以创建节点层次结构(例如,“node_a / df,node_a / sub_node / df”在单个节点中有效地保存多个框架)。 - Jeff
非常感谢Jeff。顺便问一下,在Pandas中使用HDFStore()、追加表格和使用read/write_hdf需要导入哪些包/模块? - Amelio Vazquez-Reina
1
http://pandas.pydata.org/pandas-docs/dev/install.html#optional-dependencies, numexpr & PyTables - Jeff
2
这里有一些食谱链接:http://pandas.pydata.org/pandas-docs/dev/cookbook.html#hdfstore - Jeff
显示剩余3条评论

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的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接