【问题标题】:How to add attributes to a pandas dataframe that is stored as a group in a HDF5 file?如何将属性添加到作为组存储在 HDF5 文件中的 pandas 数据框?
【发布时间】:2019-01-29 22:57:32
【问题描述】:

我有一个这样创建的多维熊猫数据框:

import numpy as np
import pandas as pd
iterables = [['bar', 'baz', 'foo', 'qux'], ['one', 'two']]
mindex = pd.MultiIndex.from_product(iterables, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(8, 4), index=mindex)
store = pd.HDFStore("df.h5")
store["df"] = df
store.close()

我想为存储在 HDFStore 中的df 添加属性。我怎样才能做到这一点?似乎没有任何关于属性的documentation,并且用于存储df 的组与h5py 模块中的HDF5 组的类型不同:

type(list(store.groups())[0])
Out[24]: tables.group.Group

似乎是 pytables 组,它只有这个私有成员函数,它涉及一些其他类型的属性:

__setattr__(self, name, value)
 |      Set a Python attribute called name with the given value.

我想要的是简单地存储一堆具有多维索引的 DataFrame,这些索引以结构化的方式由属性“标记”,以便我可以比较它们并根据这些属性对它们进行子选择。

基本上 HDF5 用于 + 来自 pandas 的 multidim DataFrames。

有像this one 这样的问题,它处理与除pandas 之外的其他阅读器一起读取HDF5 文件的问题,但它们都有带有一维索引的DataFrame,这使得简单地转储numpy ndarrays 并额外存储索引变得容易。

【问题讨论】:

  • 不管其他问题说明了什么,您应该能够使用h5dumph5py 探索您自己的table 输出。我的记忆是 pd 表的布局相当复杂。
  • @hpaulj:嗯,我正在阅读有关 h5py 的内容,在那里向数据集和组添加属性非常容易,而且熊猫似乎不支持这一点。普通的表格很容易存储,但我仍然没有弄清楚如何处理 multidim dframes。我不知道如何将属性添加到使用 HDFStore 存储的 pandas df 给出的组中。
  • 也许你可以在事后使用 h5py 添加属性。
  • @hpaulj:是的,这就是我现在正在尝试的,使用 pandas.HDFStore 将 multidim dframes 放入 HDF5,然后使用 h5py 读取文件并将属性添加到 dframe 组。

标签: python pandas hdf5 h5py


【解决方案1】:

到目前为止,我还没有得到任何答案,这就是我使用pandash5py 模块设法做到的:pandas 用于存储和读取多维 DataFrame,@987654325 @存储和读取HDF5组的属性:

import numpy as np
import pandas as pd
import h5py

# Create a random multidim DataFrame
iterables = [['bar', 'baz', 'foo', 'qux'], ['one', 'two']]
mindex = pd.MultiIndex.from_product(iterables, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(8, 4), index=mindex)

pdStore = pd.HDFStore("df.h5")
h5pyFile = h5py.File("df.h5")

# Dumping the data and storing the attributes
pdStore["df"] = df
h5pyFile["/df"].attrs["number"] = 1

# Reading the data conditionally based on stored attributes.
dfg = h5pyFile["/df"]
readDf = pd.DataFrame()
if dfg.attrs["number"] == 1:
    readDf = pdStore["/df"]

print (readDf - df)
h5pyFile.close()
pdStore.close()

我仍然不知道让h5pypandas 同时处理.h5 文件是否有任何问题。

【讨论】:

  • 关于同时使用h5pypandas,我认为这可能会导致问题。 pandas 在后台使用 PyTables,根据他们的常见问题解答,他们不支持并发。 pytables.org/… 所以我想在打开h5py.File 之前关闭HDFStore 是一个好习惯
  • 这方面还有什么进展吗?我要全速撞墙了,所以我想向最好的人学习:)
  • 不是真的,我放弃了HDF5,因为C API太繁琐,而且当时h5py对MPI的支持还不稳定。我最终使用了带有 MultiIndex 的 pandas.DataFrame 并将所有元数据打包到列数据中。这使得每一行都可以唯一标识,并且很容易使用 MultiIndex 来拼接 DataFrame。祝你好运!如果您知道如何使用 HDF5,请在此处发布答案 :)
猜你喜欢
  • 2017-12-13
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 2015-05-26
  • 2018-02-22
相关资源
最近更新 更多