巨大なHDF5ファイルがあり、その一部をpandas DataFrameにロードしていくつかの操作を実行したいのですが、いくつかの行をフィルタリングすることに興味があります。
私は例でよりよく説明することができます:
元の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
私がやろうとしているのは、これをそのままa pandas Dataframeにロードすることですが、where A==1 or 3 or 4
今までは、次を使用してHDF5全体をロードできます。
store = pd.HDFStore('Resutls2015_10_21.h5')
df = pd.DataFrame(store['results_table'])
ここにwhere
条件を含める方法がわかりません。
hdf5
のtable
引数でクエリ可能にするには、pd.read_hdf
ファイルを fixed
形式 (where
形式ではなく)で書き込む必要があります。
さらに、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である行を選択します。たとえば、
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]'))
収量
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
値のリストが非常に長い場合は、vals
、文字列フォーマットを使用して正しいwhere
引数を作成できます。
where='A in {}'.format(vals)