在 Pandas 中迭代写入 HDF5 存储

Posted

技术标签:

【中文标题】在 Pandas 中迭代写入 HDF5 存储【英文标题】:Iteratively writing to HDF5 Stores in Pandas 【发布时间】:2013-05-14 06:54:50 【问题描述】:

Pandas 有以下示例说明如何在 HDF5 文件中存储 SeriesDataFramesPanels

准备一些数据:

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()

问题:

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

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

    Pandas 文档说明如下:

    “这些商店一旦编写就不可追加(尽管您只是简单地 删除它们并重写)。它们也不是可查询的;他们必须是 完整检索。”

    不可追加也不可查询是什么意思?另外,不应该说一次close而不是written吗?

【问题讨论】:

【参考方案1】:

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

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

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

    您可以逐个遍历您的.csvstore/append。比如:

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

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

    不可附加 - 一旦你写了它,你只能一次检索它,例如你不能选择一个小节

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

    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 中? 节点名称为fstore[f] = pd.read_csv(f)相当于df.to_hdf`, but the df.to_hdf``自动为你打开/关闭商店。 store['df'] = df 创建/覆盖名为 'df' 的节点。仅供参考,继续这样做不是一个好主意,请参阅有关删除数据的部分。一个节点只能容纳一个对象(例如一个框架),但您可以根据需要创建节点层次结构(例如node_a/df, node_a/sub_node/df 在单个节点中有效地容纳多个框架 非常感谢杰夫。顺便问一下,我需要在 Pandas 中使用HDFStore()、追加表格和使用read/write_hdf 需要哪些导入/包? pandas.pydata.org/pandas-docs/dev/…, numexpr & PyTables 这里有一个链接 2 一些食谱:pandas.pydata.org/pandas-docs/dev/cookbook.html#hdfstore【参考方案2】:

回答问题 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()

基于this 部分文档。

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

【讨论】:

以上是关于在 Pandas 中迭代写入 HDF5 存储的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Pandas DataFrame 存储为 HDF5 PyTables 表(或 CArray、EArray 等)?

在 HDF5 中存储 Pandas 对象和常规 Python 对象

是否可以直接重命名存储在 hdf5 文件中的 pandas 数据框的列?

如何在 pandas 中将新类别附加到 HDF5?

将 Pandas DataFrames 保存为 HDF5 存储,各种错误

在熊猫中将可变长度列表保存到 HDF5