python / pandas извлекают определенный столбец из мультииндекса

1

В настоящее время у меня есть мультииндекс:

MultiIndex(levels=[[2012, 2013, 2014, 2015, 2016, 2017, 2018], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]],
           labels=[[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6], [10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4]],
           names=['Date', 'Date'])

Я надеялся получить вторую часть меток, а не [0,0,1,1] но [10,11,0,1,2]. Какой был бы лучший способ сделать это?

В качестве дополнительной информации мой файловый кадр в настоящее время выглядит следующим образом:

df = 

                Date  Portfolio Value    SPY Values
Date Date                                          
2012 11   2012-11-30     1.002448e+06  1.003667e+06
     12   2012-12-28     9.817744e+05  9.887664e+05
2013 1    2013-01-25     1.042036e+06  1.061184e+06
     2    2013-02-22     1.050522e+06  1.072771e+06
     3    2013-03-29     1.094525e+06  1.106260e+06
     4    2013-04-26     1.130510e+06  1.117988e+06
     5    2013-05-31     1.145836e+06  1.154727e+06
     6    2013-06-28     1.146044e+06  1.131836e+06
     7    2013-07-26     1.190659e+06  1.194927e+06
     8    2013-08-30     1.138982e+06  1.155645e+06
     9    2013-09-27     1.182957e+06  1.193585e+06
     10   2013-10-25     1.248856e+06  1.242970e+06
     11   2013-11-29     1.292239e+06  1.278790e+06
     12   2013-12-27     1.320085e+06  1.298785e+06
2014 1    2014-01-31     1.266189e+06  1.258302e+06
     2    2014-02-28     1.304377e+06  1.316448e+06
     3    2014-03-28     1.297855e+06  1.310442e+06
     4    2014-04-25     1.298360e+06  1.316306e+06 etc...

и я надеялся получить второй индекс Date, начиная с 11, 12, 1, 2, 3 и т.д.

Теги:
pandas
dataframe
python-3.x
indexing

1 ответ

2
Лучший ответ

Ваши MultiIndex этикетки являются FrozenList из FrozenNDArray объектов.

Вы можете просто получить доступ к второму массиву с помощью регулярного индексации списка:

idx = pd.MultiIndex(levels=[[2012, 2013, 2014, 2015, 2016, 2017, 2018], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]],
                    labels=[[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6], [10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4]],
                    names=['Date', 'Date'])

res = idx.labels[1]

print(res)

FrozenNDArray([10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4], dtype='int8')
  • 0
    Я собирался написать ответ, но счел более уместным прокомментировать ваш ответ. Во-первых, это правильный ответ. Тем не менее, не уверен, что ОП действительно этого хочет. Очень редко вы захотите создать MultiIndex, указав метки самостоятельно. Если все сделано правильно, метки являются просто факторизацией значений, так что вы можете сделать idx.levels[1][idx.labels[1]] чтобы получить то же самое, что и idx.get_level_values(1) . Суть в том, что я спрашиваю, почему OP хотел бы сделать это в первую очередь.
  • 0
    @piRSquared, это хороший момент. Еще один момент, о котором стоит упомянуть, это то, что labels не всегда будут согласованными (если вы объедините кадры данных с новыми значениями, я думаю, они могут измениться). Я с радостью удалю это, если ОП сможет подтвердить новое требование.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню