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

4

0 回答 0