如何将Pandas Dataframe写入HDF5数据集

时间:2017-11-07 19:23:05

标签: python-3.x pandas hdf5 h5py

我尝试将数据从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:'数据集'对象没有属性' split'

任何人都可以解决一些问题。非常感谢

2 个答案:

答案 0 :(得分:2)

df.to_hdf()期望字符串为key参数(第二个参数):

  

:字符串

     

商店中组的标识符

所以试试这个:

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

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

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

答案 1 :(得分:2)

我认为可以使用pandas \ pytables和HDFStore类而不是h5py。所以我尝试了以下

res.filter(_.contains("x"))

它可以工作,从A / d到C / f创建的9个组(组中而不是pyatbles中的数据集而不是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)