Переупорядочить мультииндекс Pandas Dataframe - PullRequest
0 голосов
/ 30 августа 2018

Я хотел бы изменить порядок столбцов в кадре данных и оставить базовые значения в правильных столбцах.

Например, это тот самый фрейм данных, который у меня есть

cols = [ ['Three', 'Two'],['A', 'D', 'C', 'B']]
header = pd.MultiIndex.from_product(cols)
df = pd.DataFrame([[1,4,3,2,5,8,7,6]]*4,index=np.arange(1,5),columns=header)                  
df.loc[:,('One','E')] = 9
df.loc[:,('One','F')] = 10

>>> df

И я хотел бы изменить это следующим образом:

header2 = pd.MultiIndex(levels=[['One', 'Two', 'Three'], ['E', 'F', 'A', 'B', 'C', 'D']],
       labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2], [0, 1, 2, 3, 4, 5, 2, 3, 4, 5]])

df2 = pd.DataFrame([[9,10,1,2,3,4,5,6,7,8]]*4,index=np.arange(1,5), columns=header2)
>>>>df2

1 Ответ

0 голосов
/ 30 августа 2018

Сначала определите категориальный порядок на верхнем уровне. Затем вызовите sort_index на первой оси с обоими уровнями.

v = pd.Categorical(df.columns.get_level_values(0), 
                   categories=['One', 'Two', 'Three'], 
                   ordered=True)
v2 = pd.Categorical(df.columns.get_level_values(1), 
                    categories=['E', 'F', 'C', 'B', 'A', 'D'],
                    ordered=True)
df.columns = pd.MultiIndex.from_arrays([v, v2]) 

df = df.sort_index(axis=1, level=[0, 1])

df
  One     Two          Three         
    E   F   C  B  A  D     C  B  A  D
1   9  10   7  6  5  8     3  2  1  4
2   9  10   7  6  5  8     3  2  1  4
3   9  10   7  6  5  8     3  2  1  4
4   9  10   7  6  5  8     3  2  1  4
...