我使用 将 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