如何将 Pandas 数据框写入 HDF5 数据集

Posted

技术标签:

【中文标题】如何将 Pandas 数据框写入 HDF5 数据集【英文标题】:How to write a Pandas Dataframe into a HDF5 dataset 【发布时间】:2018-04-20 07:49:14 【问题描述】:

我正在尝试将 Pandas 数据帧中的数据写入嵌套的 hdf5 文件,每个组中有多个组和数据集。我想将它保存为一个文件,该文件将在未来每天增长。我尝试了以下代码,它显示了我想要实现的结构

import h5py
import numpy as np
import pandas as pd

file = h5py.File('database.h5','w')

d = 'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
     'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])

df = pd.DataFrame(d) 
        
groups = ['A','B','C']         
        
for m in groups:
    
    group = file.create_group(m)
    dataset = ['1','2','3']

    for n in dataset:
    
        data = df
        ds = group.create_dataset(m + n, data.shape)
        print ("Dataset dataspace is", ds.shape)
        print ("Dataset Numpy datatype is", ds.dtype)
        print ("Dataset name is", ds.name)
        print ("Dataset is a member of the group", ds.parent)
        print ("Dataset was created in the file", ds.file)
                        
        print ("Writing data...")
        ds[...] = data        
     
        print ("Reading data back...")
        data_read = ds[...]
            
        print ("Printing data...")
        print (data_read)

file.close()

这样创建了嵌套结构,但它会丢失索引和列。我试过了

df.to_hdf('database.h5', ds, table=True, mode='a')

但没用,我收到此错误

AttributeError: 'Dataset' 对象没有属性 'split'

任何人都可以解释一下吗?非常感谢

【问题讨论】:

pandas 使用pytables 将数据帧写入hdf5 文件。使用h5py 查找这些文件有一些问题。我记得布局很复杂,但并非不可能遵循。 h5py 本质上是 numpyhdf5 的接口。 ***.com/questions/41173254/… 【参考方案1】:

df.to_hdf() 需要一个字符串作为key 参数(第二个参数):

:字符串

商店中群组的标识符

所以试试这个:

df.to_hdf('database.h5', ds.name, table=True, mode='a')

ds.name 应该返回一个字符串(键名):

In [26]: ds.name
Out[26]: '/A1'

【讨论】:

这个调用的来源pytables.to_hdf @hpaulj,是的,它调用pandas.io.pytables.to_hdf(),但我不明白你想说什么/显示... @MaxU 我已经尝试了键中的 ds.name 但不起作用,因为它仍然丢失列和索引,而且它返回全零【参考方案2】:

我想试试 pandas\pytables 和 HDFStore 类而不是 h5py。所以我尝试了以下

import numpy as np
import pandas as pd

db = pd.HDFStore('Database.h5')

index = pd.date_range('1/1/2000', periods=8)

df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=['Col1', 'Col2', 'Col3'])

groups = ['A','B','C']     

i = 1    

for m in groups:

    subgroups = ['d','e','f']

    for n in subgroups:

        db.put(m + '/' + n, df, format = 'table', data_columns = True)

它有效,从 A/d 到 C/f 创建了 9 个组(组而不是 pyatbles 中的数据集而不是 fo h5py?)。保留的列和索引可以执行我需要的数据帧操作。仍然想知道这是否是从特定组中检索数据的有效方法,该组在未来将变得巨大,即像

这样的操作
db['A/d'].Col1[4:]

【讨论】:

以上是关于如何将 Pandas 数据框写入 HDF5 数据集的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 R 中将保存在 pandas 中的数据框作为 HDF5 文件加载?

hdf5 文件到熊猫数据框

将浮点数组写入和附加到 C++ 中 hdf5 文件中的唯一数据集

如何最好地将 std::vector < std::string > 容器写入 HDF5 数据集?

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