1

Pandasto_hdfは成功しますが、read_hdfカスタム オブジェクトを列ヘッダーとして使用すると失敗します (他の情報を格納する必要があるため、カスタム オブジェクトを使用します)。

これを機能させる方法はありますか?それとも、これは単に Pandas のバグまたは PyTables のバグですか?

foo以下の例では、最初に文字列の列ヘッダーを使用する DataFrame を作成し、すべてがto_hdf/で正常に動作することを示しますが、列ヘッダーにカスタム クラスread_hdfを使用するように foo を変更しても問題なく動作しますが、アサーション エラーが発生します。Colto_hdfread_hdf

In [48]: foo = pd.DataFrame(np.random.randn(2, 3), columns = ['aaa', 'bbb', 'ccc'])

In [49]: foo
Out[49]: 
    aaa       bbb       ccc
0 -0.434303  0.174689  1.373971
1 -0.562228  0.862092 -1.361979

In [50]: foo.to_hdf('foo.h5', 'foo')

In [51]: bar = pd.read_hdf('foo.h5', 'foo')

In [52]: bar
Out[52]: 
    aaa       bbb       ccc
0 -0.434303  0.174689  1.373971
1 -0.562228  0.862092 -1.361979

In [52]: 

In [53]: class Col(object):
...:     def __init__(self, name, other_info):
...:         self.name = name
...:         self.other_info = other_info
...:     def __str__(self):
...:         return self.name
...:     

In [54]: foo = pd.DataFrame(np.random.randn(2, 3), columns = [Col('aaa', {'z': 5}), Col('bbb', {'y': True}), Col('ccc', {})])

In [55]: foo
Out[55]: 
    aaa       bbb       ccc
0 -0.830503  1.066178  1.057349
1  0.406967 -0.131430  1.970204

In [56]: foo.to_hdf('foo.h5', 'foo')

In [57]: bar = pd.read_hdf('foo.h5', 'foo')
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-57-888b061a1d2c> in <module>()
----> 1 bar = pd.read_hdf('foo.h5', 'foo')

/.../python3.4/site-packages/pandas/io/pytables.py in read_hdf(path_or_buf, key, **kwargs)
330 
331     try:
--> 332         return store.select(key, auto_close=auto_close, **kwargs)
333     except:
334         # if there is an error, close the store

/.../python3.4/site-packages/pandas/io/pytables.py in select(self, key, where, start, stop, columns, iterator, chunksize, auto_close, **kwargs)
672                            auto_close=auto_close)
673 
--> 674         return it.get_result()
675 
676     def select_as_coordinates(

/.../python3.4/site-packages/pandas/io/pytables.py in get_result(self, coordinates)
   1366 
   1367         # directly return the result
-> 1368         results = self.func(self.start, self.stop, where)
   1369         self.close()
   1370         return results

/.../python3.4/site-packages/pandas/io/pytables.py in func(_start, _stop, _where)
665             return s.read(start=_start, stop=_stop,
666                           where=_where,
--> 667                           columns=columns, **kwargs)
668 
669         # create the iterator

/.../python3.4/site-packages/pandas/io/pytables.py in read(self, **kwargs)
   2792             blocks.append(blk)
   2793 
-> 2794         return self.obj_type(BlockManager(blocks, axes))
   2795 
   2796     def write(self, obj, **kwargs):

/.../python3.4/site-packages/pandas/core/internals.py in __init__(self, blocks, axes, do_integrity_check, fastpath)
   2180         self._consolidate_check()
   2181 
-> 2182         self._rebuild_blknos_and_blklocs()
   2183 
   2184     def make_empty(self, axes=None):

/.../python3.4/site-packages/pandas/core/internals.py in _rebuild_blknos_and_blklocs(self)
   2271 
   2272         if (new_blknos == -1).any():
-> 2273             raise AssertionError("Gaps in blk ref_locs")
   2274 
   2275         self._blknos = new_blknos

AssertionError: Gaps in blk ref_locs

更新

したがって、Jeff は (a) 「これはサポートされていません」と (b) 「メタデータがある場合は属性に書き込む」と答えました。

(a) に関する質問 1: 私の列ヘッダー オブジェクトには、プロパティなどを返すメソッドがあります。たとえば、値を解析する必要がある列ヘッダー文字列 'x5y3z8' の代わりに、単に col_header.x ( 5) col_header.y (3) などを返します。これは、文字列を使用して情報を保存し、情報を取得するたびに解析する必要がなく、非常にオブジェクト指向で Pythonic です。現在の列ヘッダー オブジェクトを適切な方法で置き換えるにはどうすればよいですか (これもサポートされています)。

(ところで、「x5y3z8」を見て、階層インデックスが機能していると思うかもしれませんが、すべての列ヘッダーが「x#y#z#」であるとは限らないため、そうではありません。文字列の列「foo」と別の列があるかもしれません。 int の 'bar5baz7' と float の別の 'x5y3z8' です。列ヘッダーは統一されていません。)

(a) に関する質問 2: サポートされていないという場合、具体的に to_hdf/read_hdf がサポートされていないことについて話しているのですか、それとも Pandas が一般的にサポートしていないということですか? 欠けているのが HDF5 サポートだけである場合は、DataFrame をディスクに保存する別の方法に切り替えて、それを機能させることができますよね? 将来、そのことで何か問題が起こると予想していますか。たとえば、これは to_pickle/read_pickle で壊れますか? (性能は落ちますが、何かをあきらめなければなりませんよね?)

(b) に関する質問 3: 「メタデータがある場合は、それを属性に書き込む」とはどういう意味ですか。何の属性?簡単な例がとても役に立ちます。私はパンダにかなり慣れていません。ありがとう!

4

1 に答える 1