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

Posted

技术标签:

【中文标题】在 HDF5 中存储 Pandas 对象和常规 Python 对象【英文标题】:Storing Pandas objects along with regular Python objects in HDF5 【发布时间】:2013-07-23 02:32:50 【问题描述】:

Pandas 有一个 nice interface,便于在 HDF5 中存储数据帧和系列之类的内容:

random_matrix  = np.random.random_integers(0,10, m_size)
my_dataframe =  pd.DataFrame(random_matrix)

store = pd.HDFStore('some_file.h5',complevel=9, complib='bzip2')
store['my_dataframe'] = my_dataframe
store.close()

但如果我尝试将其他一些常规 Python 对象保存在同一个文件中,它会报错:

my_dictionary = dict()
my_dictionary['a'] = 2           # <--- ERROR
my_dictionary['b'] = [2,3,4]

store['my_dictionary'] = my_dictionary
store.close()

TypeError: cannot properly create the storer for: [_TYPE_MAP] [group->/par
ameters (Group) u'',value-><type 'dict'>,table->None,append->False,kwargs-
>]                                   

如何将常规 Python 数据结构存储在存储其他 Pandas 对象的同一个 HDF5 中?

【问题讨论】:

【参考方案1】:

以下是食谱中的示例:http://pandas.pydata.org/pandas-docs/stable/cookbook.html#hdfstore

您可以将任意对象存储为节点的属性。我相信有一个 64kb 的限制(我认为该节点的总属性数据)。对象被腌制

In [1]: df = DataFrame(np.random.randn(8,3))

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

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

# you can store an arbitrary python object via pickle
In [4]: store.get_storer('df').attrs.my_attribute = dict(A = 10)

In [5]: store.get_storer('df').attrs.my_attribute
'A': 10

【讨论】:

谢谢!顺便说一句,我得到了PerformanceWarnings 和一些store 命令。我尝试使用以下命令禁用它们:import warnings; warnings.simplefilter(action="ignore", category = PerformanceWarning),但我得到了Name 'PerformanceWarning' is not defined。你知道如何让他们静音吗? 其实你应该注意这些。这些基本上是说您正在存储 PyTables 将要使用的数据类型pickle!尝试存储为表格(使用appendstore.put('df',df,table=True)Table 格式存储;更好地处理诸如nan 某些dtypes 之类的事情(Storer 格式会给你一个PerfWarning。见@987654322 @ 如果您真的想将它们静音,请尝试:from pandas.io.pytables import PerformanceWarning。但请参阅我上面的评论。这是有原因的 谢谢杰夫。我尝试使用 store.put('my_dictionary', my_dictionary, table=True),但仍然收到我在 OP 中报告的错误。 my_dictionary 是熊猫对象吗? (如果是,那么首先做一个store.remove('my_dictionary'),如果它不是pandas对象,那么你应该使用上面的属性方法。表尝试append(而put总是覆盖)

以上是关于在 HDF5 中存储 Pandas 对象和常规 Python 对象的主要内容,如果未能解决你的问题,请参考以下文章

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

Pandas + HDF5 Panel 大数据存储

使用 pandas 读取 hdf5 数据集

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

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

如何将多个 pandas 数据帧组合到一个键/组下的 HDF5 对象中?