2017-08-11 4 views
5

は、私が最初に店にdfを書きたい次hdfstoreとデータフレームdfdf2HDFStoreをアップデートできますか?

import pandas as pd 

store = pd.HDFStore('test.h5') 

midx = pd.MultiIndex.from_product([range(2), list('XYZ')], names=list('AB')) 
df = pd.DataFrame(dict(C=range(6)), midx) 

df 

    C 
A B 
0 X 0 
    Y 1 
    Z 2 
1 X 3 
    Y 4 
    Z 5 

midx2 = pd.MultiIndex.from_product([range(2), list('VWX')], names=list('AB')) 
df2 = pd.DataFrame(dict(C=range(6)), midx2) 

df2 

    C 
A B 
0 V 0 
    W 1 
    X 2 
1 V 3 
    W 4 
    X 5 

を考えてみましょう。後の時点で

store.append('df', df) 

store.get('df') 

    C 
A B 
0 X 0 
    Y 1 
    Z 2 
1 X 3 
    Y 4 
    Z 5 

私は私が店を更新する別のデータフレームを持つことになります。古いデータを保持しながら、新しいデータフレームと同じインデックス値で行を上書きしたい。私は

store.append('df', df2) 

store.get('df') 

    C 
A B 
0 X 0 
    Y 1 
    Z 2 
1 X 3 
    Y 4 
    Z 5 
0 V 0 
    W 1 
    X 2 
1 V 3 
    W 4 
    X 5 

を行うと

は、これがすべてで、私が欲しいものではありません。 (0, 'X')(1, 'X')が繰り返されることに注意してください。私は結合されたデータフレームを操作して上書きすることができますが、これは実現不可能な多くのデータを扱うことが期待されます。

取得するストアを更新するにはどうすればよいですか?

 C 
A B 
0 V 0 
    W 1 
    X 2 
    Y 1 
    Z 2 
1 V 3 
    W 4 
    X 5 
    Y 4 
    Z 5 

あなたは、'A'の各レベルのためにそれを見'Y'と 'Z'が同じであるだろう、'V''W'は新規であり、'X'が更新されます。

これを行う正しい方法は何ですか?

+0

はあなたが働くことができます通常のインデックス(マルチインデックスではない)で – MaxU

+0

はい...私の実際のデータはマルチインデックスを持っていますが、単一のインデックスで何かを表示すると、私はそれに満足しています。 – piRSquared

+0

OK、デモの準備に時間が必要です。 – MaxU

答えて

3

アイデア:最初のHDFから、次にHDFStoreにdf2を追加(インデックス値が一致する)削除一致する行。

問題:マルチインデックスインデックスにwhere="index in df2.index"を使用する方法が見つかりませんでした。

ソリューション:は、最初に通常のものにmultiindexesを変換:

df.index = df.index.get_level_values(0).astype(str) + '_' + df.index.get_level_values(1).astype(str) 

df2.index = df2.index.get_level_values(0).astype(str) + '_' + df2.index.get_level_values(1).astype(str) 

この利回り:

In [348]: df 
Out[348]: 
    C 
0_X 0 
0_Y 1 
0_Z 2 
1_X 3 
1_Y 4 
1_Z 5 

In [349]: df2 
Out[349]: 
    C 
0_V 0 
0_W 1 
0_X 2 
1_V 3 
1_W 4 
1_X 5 

あなたはすべてのインデックスとインデックス保存format='t'data_columns=True(この意志のインデックスを使用していることを確認してくださいHDF5ファイルを作成/追加するときにwhere節で使用できるように、HDF5ファイル内の列):

store = pd.HDFStore('d:/temp/test1.h5') 
store.append('df', df, format='t', data_columns=True) 
store.close() 

今、我々は最初の一致指標でHDFStoreからそれらの行を削除することができます。

store = pd.HDFStore('d:/temp/test1.h5') 

In [345]: store.remove('df', where="index in df2.index") 
Out[345]: 2 

をしてdf2を追加します。

In [346]: store.append('df', df2, format='t', data_columns=True, append=True) 

結果:

In [347]: store.get('df') 
Out[347]: 
    C 
0_Y 1 
0_Z 2 
1_Y 4 
1_Z 5 
0_V 0 
0_W 1 
0_X 2 
1_V 3 
1_W 4 
1_X 5 
+1

ありがとうございました!私はそこでたくさん学んだ。私は今、いくつかのアイデアを持っています。私は戻って報告します。 – piRSquared

+0

@piRSquared、助けてくれたらうれしいです。はい、最終的な解決策についての短いフィードバックをお願いします。これは同じ問題を持つ人達にも役立ちます。 – MaxU

+0

df.index "構文の' where = "インデックスに問題があります。説明と回避策については、Pandas [bug#17567](https://github.com/pandas-dev/pandas/issues/17567)を参照してください。 –

関連する問題