を使用して 2 つのテーブルに DataFrame を書き込み、pandas.HDFStore.append_to_multiple
それを で読み返しますpandas.HDFStore.select_as_multiple
が、余分な行を含む DataFrame を取得します。
df = pd.DataFrame(dict(a=[1,1,1,1,1,2,2,2,2,2],
b=[4,4,4,4,4,4,4,4,4,4],
c=[6,7,6,7,6,7,6,7,6,7],
d=np.random.rand(10),
e=np.random.rand(10)))
df = df.set_index(['a', 'b', 'c'])
df
>>>
d e
a b c
1 4 6 0.576224 0.285766
7 0.642458 0.098230
6 0.579436 0.017601
7 0.740945 0.769283
6 0.758087 0.057052
2 4 7 0.092393 0.570647
6 0.960140 0.094415
7 0.940927 0.071686
6 0.289833 0.003229
7 0.274301 0.859293
store.append_to_multiple({'idx':['d'], 'data':None}, df,
selector='idx', dropna=True, index=True)
それから私はそれを読み返しました:
df2 = store.select_as_multiple(['idx' , 'data'])
df2
>>>
d e
a b c
1 4 6 0.325709 0.989198
6 0.498586 0.857124
6 0.348262 0.720234
6 0.325709 0.989198
6 0.498586 0.857124
6 0.348262 0.720234
6 0.325709 0.989198
6 0.498586 0.857124
6 0.348262 0.720234
7 0.244739 0.327261
7 0.640157 0.654922
7 0.244739 0.327261
7 0.640157 0.654922
2 4 6 0.761300 0.288723
6 0.157579 0.404413
6 0.761300 0.288723
6 0.157579 0.404413
7 0.491842 0.713137
7 0.916732 0.610775
7 0.002731 0.119276
7 0.491842 0.713137
7 0.916732 0.610775
7 0.002731 0.119276
7 0.491842 0.713137
7 0.916732 0.610775
7 0.002731 0.119276
df2
等しいと期待しdf
ていますが、余分な行があります。デバッガーをステップ実行すると、pytables.py に次の行が表示されます。
992: value = value.ix[valid_index]
これは、DataFrame が不適切に再インデックスされる場所です。これは、元の DataFrame のインデックスに重複があるためと思われますが、それが私のデータの現実です。この関数は、DataFrame が重複するインデックス値を持たないようにする必要がありますか? MultiIndex に別のレベルを追加して、インデックスに重複がないようにする簡単な方法はありますか?
削除すると正常に動作しますdropna=True
:
store.append_to_multiple({'idx':['d'], 'data':None}, df,
selector='idx', index=True)
df2 = store.select_as_multiple(['idx' , 'data'])
df2
>>>
d e
a b c
1 4 6 0.217079 0.880129
6 0.498363 0.668485
6 0.789133 0.726899
7 0.395735 0.200052
7 0.397049 0.634318
2 4 6 0.406110 0.373711
6 0.634547 0.715953
7 0.723585 0.144365
7 0.844752 0.696289
7 0.508510 0.751932
Windows x64 Python 2.7 パンダ 0.18.1