2012-12-18 17 views
15

pandas HDFStoreから特定の列を取得するにはどうすればよいですか?私は、メモリ内で操作するには大きすぎる非常に大きなデータセットで定期的に作業します。私はcsvファイルを繰り返し読み込み、各チャンクをHDFStoreオブジェクトに追加して、データのサブセットを処理したいと考えています。私は、単純なCSVファイルの読み込み、次のコードでHDFStoreにそれをロードしていますpandas.HDFStoreテーブルから列を選択

tmp = pd.HDFStore('test.h5') 
chunker = pd.read_csv('cars.csv', iterator=True, chunksize=10, names=['make','model','drop']) 
tmp.append('df', pd.concat([chunk for chunk in chunker], ignore_index=True)) 

そして出力:

In [97]: tmp 
Out[97]: 
<class 'pandas.io.pytables.HDFStore'> 
File path: test.h5 
/df  frame_table (typ->appendable,nrows->1930,indexers->[index]) 

私の質問は、私がtmp['df']から特定の列へのアクセスはどうすればよいのですか?この文書では、select()メソッドとTermオブジェクトのいくつかについて説明します。提供された例はPanelデータに適用されます。しかし、私はそれを単純なデータフレームのケースに拡張するには、あまりにも多くの初心者です。私の推測では、何とか列のインデックスを作成する必要があるということです。ありがとう!

答えて

11

HDFStoreがテーブルを記録する方法では、列はタイプごとに1つのnumpy配列として格納されます。あなたはいつも列のすべてを取り戻します。あなたはそれらをフィルタリングすることができます。したがって、あなたが求めるものについて返されます。 0.10.0では、列を含むTermを渡すことができます。

store.select('df', [ Term('index', '>', Timestamp('20010105')), 
        Term('columns', '=', ['A','B']) ]) 

か、後で

df = store.select('df', [ Term('index', '>', Timestamp('20010105') ]) 
df.reindex(columns = ['A','B']) 

axesのインデックスを再作成することができます(あなたが実際に作成すると、移調のフレームを保存するに有効であった)本当にここソリューションではありません。このパラメータを使用すると、軸の記憶域を並べ替えることができ、さまざまな方法でデータを整列させることができます。データフレームの場合、実際にはあまり意味がありません。 3dまたは4d構造の場合、ディスク上のデータの配置は、本当に高速なクエリにとって重要です。

0.10。1はより洗練されたソリューション、すなわちデータ列を可能にします。つまり、テーブルストア内に列を表示するように特定の列を選択することができます。ここに来るものの味があります。

store.append('df', columns = ['A','B','C']) 
store.select('df', [ 'A > 0', Term('index', '>', Timestamp(2000105)) ]) 

別の方法として、別のテーブルをファイルの別のノードに格納し、必要なものだけを選択することができます。

一般に、私は本当に広いテーブルを再びお勧めします。 haydenはPanelソリューションを提供しています。これは実際のデータ配列にどのようにデータをクエリするかを反映する必要があるため、今のところ利点があります。

+0

0.10.1のこの機能は存在しますか?私はそれを使用することができませんでした。 githubの未解決の問題は何ですか? – alexbw

+0

0.10.1はデータ列をサポートします。どのような問題がありますか? – Jeff

+0

私はこれを、ジェフの混乱を避けるために更新するべきだと思いますか? –

11

あなたは次のように列のインデックスを持つデータフレームを格納することができます:

import pandas as pd 
import numpy as np 
from pandas.io.pytables import Term 

index = pd.date_range('1/1/2000', periods=8) 
df = pd.DataFrame(np.random.randn(8,3), index=index, columns=list('ABC')) 

store = pd.HDFStore('mydata.h5') 
store.append('df_cols', df, axes='columns') 

をして、あなたの希望かもしれないとして選択します。

In [8]: store.select('df_cols', [Term('columns', '=', 'A')]) 
Out[8]: 
2000-01-01 0.347644 
2000-01-02 0.477167 
2000-01-03 1.419741 
2000-01-04 0.641400 
2000-01-05 -1.313405 
2000-01-06 -0.137357 
2000-01-07 -1.208429 
2000-01-08 -0.539854 

In [9]: df 
Out[9]: 
        A   B   C 
2000-01-01 0.347644 0.895084 -1.457772 
2000-01-02 0.477167 0.464013 -1.974695 
2000-01-03 1.419741 0.470735 -0.309796 
2000-01-04 0.641400 0.838864 -0.112582 
2000-01-05 -1.313405 -0.678250 -0.306318 
2000-01-06 -0.137357 -0.723145 0.982987 
2000-01-07 -1.208429 -0.672240 1.331291 
2000-01-08 -0.539854 -0.184864 -1.056217 

これは理想的な解決策ではありません。私はDataFrameのインデックス作成を1つだけ行うことができます。困ったことthe docs、少なくともaxesインデックスのみ一つのことによるDATAFRAME使用することができ、あなたに勧めているようだ:私は間違ってこれを読んですることができる

Pass the axes keyword with a list of dimension (currently must by exactly 1 less than the total dimensions of the object).

、その場合にはうまくいけば、誰かが私が間違っていることを証明することができます!

注:2つの指標(インデックスと列)でDataFrameにインデックスを付ける方法の1つは、それを2つのインデックスを使用して取得できるPanelに変換することです。しかし、項目が取り出されるたびに、選択したサブパネルからDataFrameに変換する必要があります。理想的ではありません。

+0

インデックスはdatetimeであるべきですか?私はインデックスとして文字を使用し、同じように進めました。しかし、あなたのコードでselect文が来たとき([8])。それはデータフレーム全体を検索しました。私はここに何かを逃していますか – JustInTime

+0

下記の私の答えを見てください。あなたは基本的に転置フレームを保存しています。軸の引数はここ – Jeff

+3

ほとんどの物事この例では、必要に応じて次の行を除いて私のために動作しません。 'store.append' は、それがエラーを発生させ 'とValueError(「df_cols」、DFは、=「列」の軸):いいえ'df_cols '、df、data_columns = True)' の場合は、エラーが発生します。残りのサンプルは動作します。 – karenyng

関連する問題