如何为重复索引设置多索引

How to set multindex for duplicated indices

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

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

我想将多重索引分配给重复的行,例如:

                    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

所以我遇到的问题与我一开始遇到的问题几乎完全相同。有没有更好的方法来解决这个问题?

这是使用 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

我的方案直接设置为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