我使用pandas.HDFStore.append_to_multiple
将一个DataFrame写入两个表,然后使用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 pandas 0.18.1