Пользовательские сортировки столбцов в многоуровневой базе данных панд

Задний план

У меня есть большой кадр данных с 2 уровнями столбцов, но 1 уровень строк, и я пытаюсь сортировать его следующим образом: уровень 0: в алфавитном порядке; Уровень 1: пользовательский сортировка.

пример

import pandas as pd dictionary = {'A' : {'M': [1,2,3,4,5], 'L': [6,7,8,9,1], 'F': [3,5,1,3,5] }, 'C' : {'M': [2,3,4,5,6], 'L': [7,8,9,1,2], 'F': [0,1,6,3,5] }, 'B' : {'M': [1,5,2,5,3], 'L': [9,5,6,3,4], 'F': [6,2,7,1,5] } } reform = {(outerKey, innerKey): values for outerKey, innerDict in dictionary.iteritems() for innerKey, values in innerDict.iteritems()} pd.DataFrame(reform,index=['g','h','i','j','k']) 

Тогда у меня есть

 # ABC # FLMFLMFLM # g 3 6 1 6 9 1 0 7 2 # h 5 7 2 2 5 5 1 8 3 # i 1 8 3 7 6 2 6 9 4 # j 3 9 4 1 3 5 3 1 5 # k 5 1 5 5 4 3 5 2 6 

Вопрос

Как указать порядок столбцов как A, B, C на уровне 0 и F, M, L на уровне 1?

 ### OUT # ABC # FMLFMLFML 

Я пытался с pd.IndexSlice и .loc , но я все еще получаю только буквенный порядок.

2 Solutions collect form web for “Пользовательские сортировки столбцов в многоуровневой базе данных панд”

Вы можете достичь этого с помощью reindex_axis , это принимает метки arg, ось и уровень:

 In [20]: df = df.reindex_axis(list('FML'), axis=1, level=1) df Out[20]: ABCFMLFMLFML g 3 1 6 6 1 9 0 2 7 h 5 2 7 2 5 5 1 3 8 i 1 3 8 7 2 6 6 4 9 j 3 4 9 1 5 3 3 5 1 k 5 5 1 5 3 4 5 6 2 

Благодаря @Nickli Maveli вы также можете использовать reindex для достижения того же:

 In [22]: df = df.reindex(columns=list('FML'), level=1) df Out[22]: ABCFMLFMLFML g 3 1 6 6 1 9 0 2 7 h 5 2 7 2 5 5 1 3 8 i 1 3 8 7 2 6 6 4 9 j 3 4 9 1 5 3 3 5 1 k 5 5 1 5 3 4 5 6 2 

Установка индекса при создании данных

Если впоследствии вы не захотите изменить структуру данных, вы можете дать конструктору pd.DataFrame индекс, в котором вы уже определили заказ.

Явное решение

 columns = pd.Index([('A', 'F'), ('A', 'M'), ('A', 'L'), ('B', 'F'), ('B', 'M'), ('B', 'L'),('C', 'F'), ('C', 'M'), ('C', 'L')]) pd.DataFrame(reform,index=['g','h','i','j','k'], columns=columns) 

Композитное решение

 columns = pd.Index([(level_0, level_1) for level_0 in "ABC" for level_1 in "FML"]) pd.DataFrame(reform,index=['g','h','i','j','k'], columns=columns) 

Оба дают

  ABCFMLFMLFML g 3 1 6 6 1 9 0 2 7 h 5 2 7 2 5 5 1 3 8 i 1 3 8 7 2 6 6 4 9 j 3 4 9 1 5 3 3 5 1 k 5 5 1 5 3 4 5 6 2 
  • создать биграмм из столбца в pandas df
  • Манипуляции столбцами с датами-пандами
  • Паттерн данных Pandas оставил слияние без переиндексации
  • Неоднозначное значение истины с логической логикой
  • что это означает, поставив две переменные во встроенный цикл в python
  • Прикрепите вычисленный столбец к существующему файловому кадру
  • Как перебрать сгруппированные рамки данных Pandas?
  • Pandas DataFrame нарезка днем ​​/ часом / минутой
  •  
    Interesting Posts for Van-Lav

    Как преобразовать request.cookiejar в qnetworkcookiejar?

    Завершение кода Пидева для всего

    Преобразование нерегулярного четырехугольника в прямоугольник в python matplotlib

    разница между dict (groupby) и groupby

    Вход в систему не работает при запуске приложения для пирамиды в uWSGI в режиме императора

    Использование индекса из итерированного списка

    Ссылки между ноутбуками IPython

    Как объявить длинную строку в Python?

    Проблемы с производительностью python с использованием циклов с большими таблицами

    Интерполируя трехмерную поверхность, известную своими угловыми узлами, и раскрашивая ее цветовой схемой

    Как я могу инвертировать движение курсора в python?

    Не удается установить пакет Python

    Ошибка при открытии файла изображения в PIL

    Проверьте, является ли функция методом какого-либо объекта

    Из часового пояса и времени UTC получите разницу в секундах по местному времени в этот момент времени

    Python - лучший язык программирования в мире.