在 Pandas 中迭代写入 HDF5 存储
Posted
技术标签:
【中文标题】在 Pandas 中迭代写入 HDF5 存储【英文标题】:Iteratively writing to HDF5 Stores in Pandas 【发布时间】:2013-05-14 06:54:50 【问题描述】: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()
问题:
在上面的代码中,数据是什么时候真正写入磁盘的?
假设我想将位于 .csv
文件中的数千个大型数据框添加到单个 .h5
文件中。我需要加载它们并将它们一一添加到.h5
文件中,因为我无法一次性将它们全部存储在内存中,因为它们会占用太多内存。 HDF5可以做到这一点吗?正确的做法是什么?
Pandas 文档说明如下:
“这些商店一旦编写就不可追加(尽管您只是简单地 删除它们并重写)。它们也不是可查询的;他们必须是 完整检索。”
不可追加也不可查询是什么意思?另外,不应该说一次close而不是written吗?
【问题讨论】:
【参考方案1】:一旦执行语句,例如store['df'] = df
。 close
只是关闭实际文件(如果进程存在,它将为您关闭,但会打印一条警告消息)
阅读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)
将是一种方式(为每个文件创建一个单独的节点)
不可附加 - 一旦你写了它,你只能一次检索它,例如你不能选择一个小节
如果您有一张桌子,那么您可以执行以下操作:
pd.read_hdf('my_store.h5','a_table_node',['index>100'])
类似于数据库查询,只获取部分数据
因此,存储不可追加,也不可查询,而表既可追加,也不可查询。
【讨论】:
谢谢,我对你对 2) 的回答有点困惑。为什么将f
传递给df.to_hdf
?另外,df.to_hdf
和 store['df'] = df
之间有什么区别吗?最后,我对节点与上面代码的关系感到困惑。 store['df'] = df
是否一定要在文件中创建一个新节点?有没有办法将多个 DataFrame 添加到单个节点内的单个 hdf5 中?
节点名称为f
,store[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 数据框的列?