Python Pandas - Rearrange levels using level name in MultiIndex

To rearrange levels using level name in MultiIndex, use the MultiIndex.reorder_levels() method in Pandas. This method allows you to reorder the hierarchy of index levels by specifying level names in your desired order.

Creating a MultiIndex

First, let's create a MultiIndex with three levels ?

import pandas as pd

# Create arrays for MultiIndex
arrays = [[2, 4, 3, 1], ['Peter', 'Chris', 'Andy', 'Jacob'], [50, 30, 40, 70]]

# Create MultiIndex with named levels
multiIndex = pd.MultiIndex.from_arrays(arrays, names=('rank', 'student', 'points'))

print("Original MultiIndex:")
print(multiIndex)
Original MultiIndex:
MultiIndex([(2, 'Peter', 50),
            (4, 'Chris', 30),
            (3,  'Andy', 40),
            (1, 'Jacob', 70)],
           names=['rank', 'student', 'points'])

Reordering Levels by Name

Use reorder_levels() with the order parameter to specify the new level arrangement ?

import pandas as pd

arrays = [[2, 4, 3, 1], ['Peter', 'Chris', 'Andy', 'Jacob'], [50, 30, 40, 70]]
multiIndex = pd.MultiIndex.from_arrays(arrays, names=('rank', 'student', 'points'))

# Reorder levels: student first, then rank, then points
reordered = multiIndex.reorder_levels(order=['student', 'rank', 'points'])

print("Reordered MultiIndex (student, rank, points):")
print(reordered)
Reordered MultiIndex (student, rank, points):
MultiIndex([('Peter', 2, 50),
            ('Chris', 4, 30),
            ( 'Andy', 3, 40),
            ('Jacob', 1, 70)],
           names=['student', 'rank', 'points'])

Different Ordering Examples

You can arrange levels in any order you need ?

import pandas as pd

arrays = [[2, 4, 3, 1], ['Peter', 'Chris', 'Andy', 'Jacob'], [50, 30, 40, 70]]
multiIndex = pd.MultiIndex.from_arrays(arrays, names=('rank', 'student', 'points'))

# Order: points first, then student, then rank
points_first = multiIndex.reorder_levels(order=['points', 'student', 'rank'])
print("Points first ordering:")
print(points_first)

print("\n" + "="*50 + "\n")

# Order: student, points, rank
student_points = multiIndex.reorder_levels(order=['student', 'points', 'rank'])
print("Student-points-rank ordering:")
print(student_points)
Points first ordering:
MultiIndex([(50, 'Peter', 2),
            (30, 'Chris', 4),
            (40,  'Andy', 3),
            (70, 'Jacob', 1)],
           names=['points', 'student', 'rank'])

==================================================

Student-points-rank ordering:
MultiIndex([('Peter', 50, 2),
            ('Chris', 30, 4),
            ( 'Andy', 40, 3),
            ('Jacob', 70, 1)],
           names=['student', 'points', 'rank'])

Key Points

  • The order parameter takes a list of level names in the desired sequence
  • All level names must be specified in the order list
  • The method returns a new MultiIndex with reordered levels
  • Original MultiIndex remains unchanged

Conclusion

Use MultiIndex.reorder_levels() to rearrange the hierarchy of index levels by specifying level names in your desired order. This is useful for changing the grouping structure of hierarchical data without modifying the underlying data values.

Updated on: 2026-03-26T17:23:39+05:30

402 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements