如何为重复索引设置multindex

时间:2019-04-26 15:08:54

标签: python-3.x pandas dataframe analysis

我有一个具有重复索引的数据框df:

        a
o_idx
411     x
412     y
412     x
412     z
450     a
450     b

我想将multindex分配给重复的行,例如:

                    a
o_idx    index
411        0        x
412        0        y
412        1        x
412        2        z
450        0        a
450        1        b

如果新索引不是重复索引,则新索引为0。如果它是重复项,则新索引应在其重复次数的长度范围内。

我尝试通过消除重复来尝试制作两个数据帧:

a = df[~df.index.duplicated(keep=False)]
a = a.reset_index()
a.index = np.zeros(len(a.index), dtype = int)
a = a.reset_index()
a = a.set_index(['index', 'o_idx'])
a.index.names = ['index', 'o_idx']

然后获取副本:

b = df[df.index.duplicated(keep=False)]
b = b.reset_index()
b.index = range(len(b.index))
b = b.reset_index()
b = b.set_index(['index', 'o_idx'])
b.index.names = ['index', 'o_idx']

然后串联:

c = pd.concat([a,b])

但是这不能给我正确的结果,因为b等于:

                    a
o_idx    index
412        0        y
412        1        x
412        2        z
450        3        a
450        4        b

因此,我几乎遇到了与开始时完全相同的问题。有更好的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

这是使用cumcount然后使用set_index返回

的一种方法
yourdf=df.assign(index=df.groupby(level=0).cumcount()).set_index('index',append=True)
yourdf
Out[568]: 
             a
o_idx index   
411   0      x
412   0      y
      1      x
      2      z
450   0      a
      1      b

答案 1 :(得分:0)

我的解决方案直接设置为index

In [1649]: df.set_index(df.groupby(level=0).cumcount(), append=True)
Out[1649]:
       a
411 0  x
412 0  y
    1  x
    2  z
450 0  a
    1  b