Добавить уровень в панды MultiIndex - PullRequest
0 голосов
/ 30 мая 2018

Скажем, у меня есть фрейм данных pandas с тремя индексами 'a', 'b' и 'c' - как я могу добавить четвертый индекс из массива и установить его имя в 'd' одновременно?

Это работает:

df.set_index(fourth_index, append=True, inplace=True)
df.index.set_names(['a','b','c','d'], inplace=True)

Но я ищу что-то, что не требует, чтобы я снова назвал первые три индекса, например (это не работает):

df.set_index({'d': fourth_index}, append=True, inplace=True)

Мне здесь не хватает какой-то функции?

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Почему бы просто не сохранить имена предыдущих значений из ранее, т.е.

old_names = df.index.names
df.set_index(fourth_index, append=True, inplace=True)
df.index.set_names(old_names + ['d'], inplace=True)

Это сохранит преимущества хорошей производительности и не требует повторного ввода старых имен.

0 голосов
/ 30 мая 2018

Добавьте fourth_index в качестве столбца и затем вызовите set_index.Имя сохранено.

df = df.assign(d=fourth_index).set_index('d', append=True)

Обратите внимание: если вы беспокоитесь о памяти, то все, что вы делаете, прекрасно, как есть.Нет смысла жертвовать производительностью ради меньшего количества персонажей.


Демо

df
          a   b   c   d
l1  l2                 
bar one  24  13   8   9
    two  11  30   7  23
baz one  21  31  12  30
    two   2   5  19  24
foo one  15  18   3  16
    two   2  24  28  11
qux one  23   9   6  12
    two  29  28  11  21

df.assign(l3=1).set_index('l3', append=True)

             a   b   c   d
l1  l2  l3                
bar one 1   24  13   8   9
    two 1   11  30   7  23
baz one 1   21  31  12  30
    two 1    2   5  19  24
foo one 1   15  18   3  16
    two 1    2  24  28  11
qux one 1   23   9   6  12
    two 1   29  28  11  21
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...