pandas.HDFStore.append_to_multiple with pandas.MultiIndex
Я пишу 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