2015-10-31 14 views
6

私は巨大なHDF5ファイルを持っている、私はいくつかの操作を実行するために、その一部をpandas DataFrameにロードしたいが、私はいくつかの行をフィルタリングに興味があります。条件とのpandas DataFrameにHDF5ファイルを読む

私は例を挙げてよりよく説明することができます:

オリジナルHDF5ファイルのようなものになります。私が何をしようとしています何

A B C D 
1 0 34 11 
2 0 32 15 
3 1 35 22 
4 1 34 15 
5 1 31 9 
1 0 34 15 
2 1 29 11 
3 0 34 15 
4 1 12 14 
5 0 34 15 
1 0 32 13 
2 1 34 15 
etc etc etc etc 

をパンダに、それはまったく同じように、これをロードすることですデータフレームだけwhere A==1 or 3 or 4

今まで私はちょうど使用して全体のHDF5をロードすることができます。

store = pd.HDFStore('Resutls2015_10_21.h5') 
df = pd.DataFrame(store['results_table']) 

ここにwhereの条件を含める方法はありません。

答えて

6

hdf5ファイルpd.read_hdfwhere引数を照会すべき ために(fixedフォーマットとは対照的に)table formatに書き込まれなければなりません。

さらに、Adeclared as a data_columnでなければなりません:

df.to_hdf('/tmp/out.h5', 'results_table', mode='w', data_columns=['A'], 
      format='table') 

または、(照会可能)データ列としてすべての列を指定するには:

df.to_hdf('/tmp/out.h5', 'results_table', mode='w', data_columns=True, 
      format='table') 

次にあなたが

pd.read_hdf('/tmp/out.h5', 'results_table', where='A in [1,3,4]') 

を使用することができます値列Aが1,3または4の行を選択します。

where='A in {}'.format(vals) 
:たとえば、

import numpy as np 
import pandas as pd 

df = pd.DataFrame({ 
    'A': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2], 
    'B': [0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1], 
    'C': [34, 32, 35, 34, 31, 34, 29, 34, 12, 34, 32, 34], 
    'D': [11, 15, 22, 15, 9, 15, 11, 15, 14, 15, 13, 15]}) 

df.to_hdf('/tmp/out.h5', 'results_table', mode='w', data_columns=['A'], 
      format='table') 

print(pd.read_hdf('/tmp/out.h5', 'results_table', where='A in [1,3,4]')) 

には、値、valsの非常に長いリストを持っている場合は、あなたが正しいwhere引数を構成する文字列書式を使用することができ

A B C D 
0 1 0 34 11 
2 3 1 35 22 
3 4 1 34 15 
5 1 0 34 15 
7 3 0 34 15 
8 4 1 12 14 
10 1 0 32 13 

を生み出します

+0

ありがとうございましたunutbu、ちょうどこの良い答えのいくつかのコメント。私はあなたの答えの初めにdfをh5に表形式で書き込むことを理解しています。しかし、私のスクリプトへの入力はすでに保存されているので、正しい形式であるかどうかをどのように知ることができますか? – codeKiller

+0

'h5'ファイルが' table'フォーマットでない場合、 'where.'パラメータで' pd.read_hdf'を使用すると、 'TypeError:固定フォーマットから読み込むときにどこに指定を渡すことはできません。' ' 'A'が' data_column'として指定されていない 'h5'ファイルが' table'形式である場合、 'ValueError:'が渡されます。ここで、[1,3,4]の式Aには無効な変数参照... '。 – unutbu

+0

h5ファイルを 'fixed'から' table'フォーマットに変換するか、 'data_columns'を追加するための素早く簡単な方法はわかりません。私が知る限り、あなたは 'h5'ファイル全体をDataFrameに読み込んで(または' chunksize'パラメータを使ってチャンクで行い)、それを書き出すか、別の 'h5'ファイルに追加する必要があります'table'フォーマットです。 – unutbu

1

pandas.read_hdfhere)を使用して、オプションパラメータwhereを使用してこれを行うことができます。 exampleについて
read_hdf('store_tl.h5', 'table', where = ['index>2'])

+0

ありがとうございました。より複雑な条件を含めることは可能ですか?たとえば、A列の値が1から100までで、[1,3,11,16,27,33,34,44,41,55,68,70,77,81]のようなランダムなものを選択したい場合、90] ...私はそれを簡単にしたいので、私はそれを簡単にしたいが、主な質問が本当にケースでは、より複雑にする必要があるので、質問しています – codeKiller

+0

あなたが渡す必要があるExprここで:http://nullege.com/codes/search/pandas.computation.pytables.Expr?fulldoc=1(これは参考になるかもしれませんが、封じ込めでフィルタリングするオプションは表示されません) –

+0

大丈夫、ありがとう – codeKiller