Как установить мультииндекс для дублированных индексов - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть датафрейм 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

Так что у меня почти такая же проблема, как и в начале. Есть ли лучший способ приблизиться к этому?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Мое решение установлено на 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
0 голосов
/ 26 апреля 2019

Вот один из способов использования 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
...