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

Задний план

У меня есть большой кадр данных с 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 - удаление строк на основе комбинаций значений NaN
  • Чтение нескольких CSV-файлов в Python Pandas Dataframe
  • Предупреждение о копировании в серии Pandas
  • Запоминание SQL-запросов
  • Какой самый быстрый способ в Python вычислить подобие косинуса при использовании разреженных матричных данных?
  • Как обрабатывать NaN или не выровненные значения как 1s или 0s при умножении pandas DataFrames
  • Как найти 5-минутные пробелы в кадре данных Pandas?
  • Индексация и столбцы данных в Pandas / PyTables
  • Python - лучший язык программирования в мире.