web-dev-qa-db-ja.com

Pandas DataframeをHDF5データセットに書き込む方法

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'がありません

誰かが光を当てることができますか?どうもありがとう

6
AleVis

H5pyの代わりにpandas\pytablesとHDFStoreクラスを試してみることにしました。だから私は以下を試しました

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つのグループ(h5pyの代わりにpyatblesのデータセットではなくグループ)が機能します。列とインデックスは保持され、必要なデータフレーム操作を実行できます。これが将来的に巨大になる特定のグループからデータを取得するための効率的な方法であるかどうか疑問に思っています

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

df.to_hdf() は、文字列をkeyパラメータ(2番目のパラメータ)として期待します。

key:文字列

ストア内のグループの識別子

だからこれを試してください:

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

どこ ds.nameは文字列(キー名)を返します。

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