Установить порядок многоиндексных столбцов в панде - PullRequest
0 голосов
/ 28 июня 2018

Есть ли способ переупорядочить определенные уровни в индексе столбцов в кадре данных Pandas на основе моих личных предпочтений (например, упорядоченным списком)?

In [130]: frame = pd.DataFrame({
     ...: ('TWO','thing1'):[1,2,3,4],
     ...: ('TWO','thing4'):[1,2,3,4],
     ...: ('DARK','thing1'):[0.1,0.2,1,2],
     ...: ('ANTS','thing3'):['a','e','i','o'],
     ...: ('ANTS','thing1'):['a','e','i','o']})

In [131]: frame
Out[131]: 
    ANTS          DARK    TWO       
  thing1 thing3 thing1 thing1 thing4
0      a      a    0.1      1      1
1      e      e    0.2      2      2
2      i      i    1.0      3      3
3      o      o    2.0      4      4

Мой список основывается на отдельном сгенерированном списке. Важно отметить, что я не знаю ни level 0, ни level 1 индексных меток - они являются переменными.

In [132]: sort_list = ['DARK', 'ANTS', 'TWO']

Если я тогда попытаюсь передать этот список в контексте frame = frame[sort_list] или .reindex(columns=sort_list), он выдаст Expected tuple, got str по очевидным причинам. Здесь - это решения, работающие с одноуровневым индексом.

То, что я хотел бы сделать, это только отсортировать на верхнем уровне и оставить второй уровень как есть. Конечный кадр данных выглядит следующим образом ...

  DARK   ANTS           TWO       
thing1 thing1 thing3 thing1 thing4
   0.1      a      a      1      1
   0.2      e      e      2      2
   1.0      i      i      3      3
   2.0      o      o      4      4

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вариант 1

Вы можете отсортировать индекс, затем нарезать

frame.sort_index(axis=1, level=1)[['DARK', 'ANTS', 'TWO']]

    DARK   ANTS           TWO       
  thing1 thing1 thing3 thing1 thing4
0    0.1      a      a      1      1
1    0.2      e      e      2      2
2    1.0      i      i      3      3
3    2.0      o      o      4      4

Вариант 2

Установить упорядоченный по категориям первый уровень столбцов

frame.columns = frame.columns.set_levels(
    pd.CategoricalIndex(
        frame.columns.levels[0],
        ['DARK', 'ANTS', 'TWO'],
        ordered=True
    ), level=0
)

frame.sort_index(axis=1)

    DARK   ANTS           TWO       
  thing1 thing1 thing3 thing1 thing4
0    0.1      a      a      1      1
1    0.2      e      e      2      2
2    1.0      i      i      3      3
3    2.0      o      o      4      4
0 голосов
/ 28 июня 2018

Вы можете использовать reindex

frame.reindex(sort_list, level=0, axis=1)
Out[126]: 
    DARK   ANTS           TWO       
  thing1 thing1 thing3 thing1 thing4
0    0.1      a      a      1      1
1    0.2      e      e      2      2
2    1.0      i      i      3      3
3    2.0      o      o      4      4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...