2013-11-28 10 views
5

分析を行う際に消費するRAMの量を管理するために、hdf5(.h5)に格納された大量のデータセットを持っており、Pandasを使用してこのデータセットを効率よく照会する必要があります。Pandas/Pythonを使用してHDFストアを照会する方法

データセットには、一連のアプリのユーザーパフォーマンスデータが含まれています。可能な限りいくつかのフィールドを抜き出し、得られたデータフレームを、興味のあるいくつかのアプリケーションのうちの1つを使用しているユーザーだけにフィルタしたいと思う。

# list of apps I want to analyze 
apps = ['a','d','f'] 

# Users.h5 contains only one field_table called 'df' 
store = pd.HDFStore('Users.h5') 

# the following query works fine 
df = store.select('df',columns=['account','metric1','metric2'],where=['Month==10','IsMessager==1']) 

# the following pseudo-query fails 
df = store.select('df',columns=['account','metric1','metric2'],where=['Month==10','IsMessager==1', 'app in apps']) 

「app in app」という文字列は、私が望むものではないことを認識しています。これは単に私が達成したいと思うもののSQLのような表現です。どのような方法でも文字列のリストを渡すことはできませんが、方法が必要です。今、私は単純に、このパラメータなしでクエリを実行していますし、私は、私は以下のようなものを

df = df[df['app'].isin(apps)] 

次のステップにしたくない。しかし、これはアプリケーションのALLため、あまり効率的であるアプリケーションをフィルタリングするために

私はそれらを削除する前に、まずメモリにロードする必要があります。場合によっては、フィルタリングされていないdf全体をサポートするのに十分なメモリがないため、これは大きな問題です。

私は助けていただきありがとうございます。これは私の最初のStackOverflowの質問ですので、アドバイスも歓迎します。

答えて

13

あなたはかなり近づいています。

In [1]: df = DataFrame({'A' : ['foo','foo','bar','bar','baz'], 
         'B' : [1,2,1,2,1], 
         'C' : np.random.randn(5) }) 

In [2]: df 
Out[2]: 
    A B   C 
0 foo 1 -0.909708 
1 foo 2 1.321838 
2 bar 1 0.368994 
3 bar 2 -0.058657 
4 baz 1 -1.159151 

[5 rows x 3 columns] 

は(0.12であなたがむしろformat='table'より、table=Trueを使用することに注意してください)、テーブルなどの店舗を書きます。あなたがテーブルを作成するときに照会するdata_columnsを指定することを忘れないでください(またはあなたがdata_columns=Trueを行うことができます)、マスター/ 0.13で

In [3]: df.to_hdf('test.h5','df',mode='w',format='table',data_columns=['A','B']) 

In [4]: pd.read_hdf('test.h5','df') 
Out[4]: 
    A B   C 
0 foo 1 -0.909708 
1 foo 2 1.321838 
2 bar 1 0.368994 
3 bar 2 -0.058657 
4 baz 1 -1.159151 

[5 rows x 3 columns] 

構文を、ISINはquery_column=list_of_valuesを介して達成されます。これはどこに文字列として表示されます。

In [8]: pd.read_hdf('test.h5','df',where='A=["foo","bar"] & B=1') 
Out[8]: 
    A B   C 
0 foo 1 -0.909708 
2 bar 1 0.368994 

[2 rows x 3 columns] 

構文は0.12であり、これはリストでなければなりません。

In [11]: pd.read_hdf('test.h5','df',where=[pd.Term('A','=',["foo","bar"]),'B=1']) 
Out[11]: 
    A B   C 
0 foo 1 -0.909708 
2 bar 1 0.368994 

[2 rows x 3 columns] 
+0

Thanks @Jeff。それは素晴らしい仕事をした –

関連する問題