ストア、それをテーブルとして
In [42]: store = pd.HDFStore('test.h5',mode='w')
In [43]: store.append('df',mi)
get_storer
が格納されているオブジェクトを返します(ただし、データを取得していない)
In [44]: store.get_storer('df').levels
Out[44]: ['one', 'two']
In [2]: store
Out[2]:
<class 'pandas.io.pytables.HDFStore'>
File path: test.h5
/df frame_table (typ->appendable_multi,nrows->100000,ncols->5,indexers->[index],dc->[two,one])
ます
In [35]: df = DataFrame(randn(100000,3),columns=list('ABC'))
In [36]: df['one'] = 'foo'
In [37]: df['two'] = 'bar'
In [38]: df.ix[50000:,'two'] = 'bah'
In [40]: mi = df.set_index(['one','two'])
In [41]: mi
Out[41]:
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 100000 entries, (foo, bar) to (foo, bah)
Data columns (total 3 columns):
A 100000 non-null values
B 100000 non-null values
C 100000 non-null values
dtypes: float64(3)
dfをマルチインデックスを作成します。インデックスレベルはdata_columnsとして作成されます。つまり、選択範囲で使用できます。 これは単一の列を選択することもできるシリーズ(として単一の列を選択するにはMI-フレーム
In [49]: store.select('df',columns=['A'])
Out[49]:
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 100000 entries, (foo, bar) to (foo, bah)
Data columns (total 1 columns):
A 100000 non-null values
dtypes: float64(1)
としてそれを返すための唯一の指標
In [48]: store.select('df',columns=['one'])
Out[48]:
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 100000 entries, (foo, bar) to (foo, bah)
Empty DataFrame
を選択する方法でありますインデックスは列として格納されます)。これはかなり速いでしょう。
In [2]: store.select_column('df','one')
Out[2]:
0 foo
1 foo
2 foo
3 foo
4 foo
5 foo
6 foo
7 foo
8 foo
9 foo
10 foo
11 foo
12 foo
13 foo
14 foo
...
99985 foo
99986 foo
99987 foo
99988 foo
99989 foo
99990 foo
99991 foo
99992 foo
99993 foo
99994 foo
99995 foo
99996 foo
99997 foo
99998 foo
99999 foo
Length: 100000, dtype: object
あなたが本当に唯一のインデックス
In [4]: %timeit store.select_column('df','one')
100 loops, best of 3: 8.71 ms per loop
In [5]: %timeit store.select('df',columns=['one'])
10 loops, best of 3: 43 ms per loop
それとも、各レベルの値をしたい場合は、完全なインデックス
In [6]: def f():
...: level_1 = store.select_column('df','one')
...: level_2 = store.select_column('df','two')
...: return MultiIndex.from_arrays([ level_1, level_2 ])
...:
In [17]: %timeit f()
10 loops, best of 3: 28.1 ms per loop
を得るために、非常に高速の最速の選択をしたい場合それを行う方法
In [2]: store.select_column('df','one').unique()
Out[2]: array(['foo'], dtype=object)
In [3]: store.select_column('df','two').unique()
Out[3]: array(['bar', 'bah'], dtype=object)
素晴らしい回答、ありがとうございます。私は直接答えがstore.rootを見ていることだと思う*。テーブルは無駄です。さらに検討すると、あなたの反応に刺激を受けて、選択肢にすべてのデータを考慮させる必要があります。どのインデックス値が同じスペースを取るかを示すメタデータを取得しようとしています。説明のために、私のマルチインデックスのすべての可能な組み合わせが満たされているわけではないので、マルチインデックスのレベルを取得するだけでは不十分です。ありがとうございました。 – Tony
'' select_column(...)。unique() ''も便利です。実際には特定のレベルの値が得られますが、それが役に立つかどうかは分かりません。 – Jeff
メソッドIただ提案しました – Jeff