0

I have a multi-index pd.DataFrame. I want the index to be sorted in ascending order. However, the outermost level_1 is an exception. This level should be sorted according to ``["B", "A", "C"].

import pandas as pd
import numpy as np

# Create multi-index
index = pd.MultiIndex.from_tuples([
    ('B', 'Y', 'II', 'D'),
    ('A', 'X', 'I', 'A'),
    ('C', 'Z', 'II', 'B'),
    ('A', 'Y', 'I', 'B'),
    ('C', 'X', 'I', 'A')
], names=['level_1', 'level_2', 'level_3', 'level_4'])

# Create DataFrame with random values
data = np.random.randint(0, 10, (5, 2))
df = pd.DataFrame(data, index=index, columns=['column1', 'column2'])

print(df)
                                 column1  column2
level_1 level_2 level_3 level_4                  
B       Y       II      D              1        7
A       X       I       B              9        4
C       Z       I       B              5        3
A       Y       I       A              2        4
C       X       II      A              9        2

I am looking for the following result:

                                 column1  column2
level_1 level_2 level_3 level_4                  
B       Y       II      D              1        7
A       X       I       B              9        4
A       Y       I       A              2        4
C       X       II      A              9        2
C       Z       I       B              5        3
Andi
  • 3,196
  • 2
  • 24
  • 44
  • Make `level_1` an ordered Categorical and use `sort_index`. You have to reconstruct the whole MultiIndex. Alternatively, use [`np.lexsort`](https://numpy.org/doc/stable/reference/generated/numpy.lexsort.html) passing each level manually, for the first one `map` numeric values `{'B': 1, 'A': 2, 'C': 3}` – mozway Aug 17 '23 at 07:30
  • 1
    Try this: `df = df.sort_index(ascending=True).loc[['B', 'A', 'C']]` – jlgarcia Aug 17 '23 at 07:31
  • This is also a nice workaround for this particular situation @jlgarcia ;) – mozway Aug 17 '23 at 07:34

0 Answers0