与pandas.MultiIndex

时间:2016-07-01 19:17:58

标签: python pandas hdfstore

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

0 个答案:

没有答案