如何将Pandas Dataframe写入HDF5数据集

8
我正在尝试将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 文件。有一些 Stack Overflow 的问题涉及到如何使用 h5py 访问这些文件。 据我回忆,文件的布局是复杂的,但并不难以理解。h5py 本质上是 numpyhdf5 的接口。 - hpaulj
https://dev59.com/u53ha4cB1Zd3GeqPT2UY - hpaulj
2个回答

4

df.to_hdf()函数的第二个参数key需要传入一个字符串:

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
@hpaulj,是的,它调用了pandas.io.pytables.to_hdf(),但我不明白你想说/展示什么... - MaxU - stand with Ukraine
@MaxU 我已经尝试了在键中使用ds.name,但它不起作用,因为它仍然会丢失列和索引,并且返回所有零。 - AleVis

3

我想尝试使用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 中使用组而不是 h5py 中的数据集?)。列和索引被保留,并且可以执行我需要的数据帧操作。但仍然有疑问,即这是否是从将来变得庞大的特定组中检索数据的有效方法,例如像:

db['A/d'].Col1[4:]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接