web-dev-qa-db-ja.com

HDF5ファイルをpandas DataFrameと条件付きで読み取る

巨大な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条件を含める方法がわかりません。

10
codeKiller

hdf5table引数でクエリ可能にするには、pd.read_hdfファイルを fixed形式where形式ではなく)で書き込む必要があります。

さらに、Adata_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)
8
unutbu

これは、_pandas.read_hdf_( here )を使用し、オプションのパラメーターwhereを使用して行うことができます。
の場合:read_hdf('store_tl.h5', 'table', where = ['index>2'])

1
Dean Fenster