Bird
Raised Fist0
Pandasdata~10 mins

Sorting MultiIndex in Pandas - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Sorting MultiIndex
Create MultiIndex DataFrame
↓
Choose sort level(s)
↓
Apply sort_index(level=...)
↓
DataFrame rows reordered
↓
Sorted MultiIndex DataFrame output
We start with a DataFrame having a MultiIndex, select which index level(s) to sort by, apply sorting, and get the reordered DataFrame.
Execution Sample
Pandas
import pandas as pd
idx = pd.MultiIndex.from_tuples([('b', 2), ('a', 1), ('b', 1)])
df = pd.DataFrame({'val': [10, 20, 30]}, index=idx)
sorted_df = df.sort_index(level=0)
This code creates a MultiIndex DataFrame and sorts it by the first level of the index.
Execution Table
StepActionIndex BeforeSort LevelIndex AfterDataFrame Rows Order
1Create MultiIndex DataFrame[('b',2), ('a',1), ('b',1)]N/A[('b',2), ('a',1), ('b',1)]Rows: b-2, a-1, b-1
2Choose sort level=0 (first level)[('b',2), ('a',1), ('b',1)]0N/AN/A
3Apply sort_index(level=0)[('b',2), ('a',1), ('b',1)]0[('a',1), ('b',1), ('b',2)]Rows reordered to a-1, b-1, b-2
4Output sorted DataFrame[('a',1), ('b',1), ('b',2)]0[('a',1), ('b',1), ('b',2)]Rows: a-1, b-1, b-2
💡 Sorting completes after reordering rows by the specified MultiIndex level.
Variable Tracker
VariableStartAfter Step 1After Step 3Final
idxempty[('b',2), ('a',1), ('b',1)][('b',2), ('a',1), ('b',1)][('b',2), ('a',1), ('b',1)]
df.indexempty[('b',2), ('a',1), ('b',1)][('b',2), ('a',1), ('b',1)][('b',2), ('a',1), ('b',1)]
sorted_df.indexN/AN/AN/A[('a',1), ('b',1), ('b',2)]
df rows orderemptyb-2, a-1, b-1b-2, a-1, b-1b-2, a-1, b-1
sorted_df rows orderN/AN/AN/Aa-1, b-1, b-2
Key Moments - 3 Insights
Why does sorting by level=0 reorder the rows differently than the original?
Because level=0 refers to the first index level ('a' or 'b'), sorting rearranges rows to order by that level alphabetically, as shown in execution_table step 3.
Does the original DataFrame 'df' change after sorting?
No, 'df' remains unchanged; sorting returns a new DataFrame 'sorted_df' with reordered rows, as seen in variable_tracker where 'df' index stays the same but 'sorted_df' index changes.
What happens if you sort by level=1 instead?
Sorting by level=1 orders rows by the second index level (numbers), changing the row order accordingly. This would reorder rows differently than sorting by level=0.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 3, what is the first index tuple after sorting by level=0?
A('b', 1)
B('b', 2)
C('a', 1)
D('a', 2)
💡 Hint
Check the 'Index After' column at step 3 in the execution_table.
At which step does the DataFrame rows order change?
AStep 3
BStep 2
CStep 1
DStep 4
💡 Hint
Look at the 'DataFrame Rows Order' column in execution_table to see when rows reorder.
If we sorted by level=1 instead, which of these would likely be the first row index?
A('b', 1)
B('a', 1)
C('b', 2)
D('a', 2)
💡 Hint
Look at the second element in the tuples and consider sorting by level=1 in variable_tracker.
Concept Snapshot
Sorting MultiIndex DataFrames:
- Use df.sort_index(level=level_number) to sort by a specific index level.
- Level 0 is the first index level, level 1 the second, etc.
- Sorting returns a new DataFrame; original stays unchanged.
- Rows reorder based on the chosen index level's values.
Full Transcript
This visual execution shows how to sort a pandas DataFrame with a MultiIndex. We start by creating a DataFrame with a MultiIndex of tuples. Then we choose which index level to sort by, for example level 0, the first index level. Applying sort_index(level=0) rearranges the rows so that the first index level is sorted alphabetically. The original DataFrame remains unchanged, and a new sorted DataFrame is returned. The execution table traces each step, showing the index before and after sorting, and how the rows reorder. The variable tracker shows how the index variables change through the process. Key moments clarify common confusions like why the original DataFrame doesn't change and what sorting by different levels means. The quiz tests understanding of the index order after sorting and when the rows reorder. The snapshot summarizes the key points for quick reference.

Practice

(1/5)
1. What does sorting a MultiIndex in pandas do?
easy
A. It removes duplicate rows from the DataFrame.
B. It merges multiple DataFrames into one.
C. It changes the data types of the index levels.
D. It arranges the data based on one or more index levels in order.

Solution

  1. Step 1: Understand MultiIndex structure

    A MultiIndex has multiple levels that can be sorted independently or together.
  2. Step 2: Define sorting effect

    Sorting organizes rows by the values in these index levels, making data easier to analyze.
  3. Final Answer:

    It arranges the data based on one or more index levels in order. -> Option D
  4. Quick Check:

    Sorting MultiIndex = Arrange by index levels [OK]
Hint: Sorting MultiIndex orders data by index levels [OK]
Common Mistakes:
  • Confusing sorting with removing duplicates
  • Thinking sorting changes data types
  • Mixing sorting with merging DataFrames
2. Which of the following is the correct syntax to sort a pandas DataFrame df by its MultiIndex?
easy
A. df.sort(level=[0,1], ascending=[True, False])
B. df.sort_values(by=['level_0', 'level_1'])
C. df.sort_index(level=[0,1], ascending=[True, False])
D. df.sort_index(by=['level_0', 'level_1'])

Solution

  1. Step 1: Recall sorting MultiIndex method

    Use sort_index() to sort by index levels, specifying levels and order.
  2. Step 2: Check syntax correctness

    df.sort_index(level=[0,1], ascending=[True, False]) correctly uses sort_index(level=[0,1], ascending=[True, False]). Others use wrong methods or parameters.
  3. Final Answer:

    df.sort_index(level=[0,1], ascending=[True, False]) -> Option C
  4. Quick Check:

    sort_index with level and ascending = correct syntax [OK]
Hint: Use sort_index(level=..., ascending=...) for MultiIndex [OK]
Common Mistakes:
  • Using sort_values instead of sort_index for MultiIndex
  • Passing 'by' parameter to sort_index
  • Using deprecated sort() method
3. Given the following code, what will be the order of the MultiIndex after sorting?
import pandas as pd
index = pd.MultiIndex.from_tuples([('b', 2), ('a', 3), ('b', 1), ('a', 2)])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=index)
sorted_df = df.sort_index(level=[0,1], ascending=[True, False])
print(sorted_df.index.tolist())
medium
A. [('a', 3), ('a', 2), ('b', 2), ('b', 1)]
B. [('a', 2), ('a', 3), ('b', 1), ('b', 2)]
C. [('b', 1), ('b', 2), ('a', 2), ('a', 3)]
D. [('b', 2), ('b', 1), ('a', 3), ('a', 2)]

Solution

  1. Step 1: Understand sorting parameters

    Level 0 sorted ascending (a before b), level 1 descending (higher number first).
  2. Step 2: Apply sorting to tuples

    For 'a': (3,2) sorted descending gives (3), then (2). For 'b': (2,1) sorted descending gives (2), then (1).
  3. Final Answer:

    [('a', 3), ('a', 2), ('b', 2), ('b', 1)] -> Option A
  4. Quick Check:

    Level 0 asc, Level 1 desc = [('a',3),('a',2),('b',2),('b',1)] [OK]
Hint: Sort level 0 ascending, level 1 descending to get correct order [OK]
Common Mistakes:
  • Sorting both levels ascending by default
  • Confusing ascending order for level 1
  • Not matching index tuples correctly
4. You run this code but get an error:
df.sort_index(level=[0,1], ascending=True, inplace=True)

What is the likely cause?
medium
A. The 'ascending' parameter must be a list when sorting multiple levels.
B. The 'inplace' parameter is not supported in sort_index.
C. The 'level' parameter cannot accept a list.
D. The DataFrame does not have a MultiIndex.

Solution

  1. Step 1: Check parameter types for multiple levels

    When sorting multiple levels, 'ascending' must be a list matching levels count.
  2. Step 2: Identify error cause

    Passing a single boolean True instead of a list causes a ValueError.
  3. Final Answer:

    The 'ascending' parameter must be a list when sorting multiple levels. -> Option A
  4. Quick Check:

    ascending list needed for multiple levels [OK]
Hint: Use list for ascending when sorting multiple levels [OK]
Common Mistakes:
  • Passing single bool to ascending with multiple levels
  • Assuming inplace is unsupported
  • Misunderstanding level parameter type
5. You have a MultiIndex DataFrame with levels 'Country' and 'Year'. You want to sort it so that 'Country' is ascending but 'Year' is descending, and then reset the index to get a flat DataFrame sorted accordingly. Which code snippet achieves this?
hard
A. df.sort_values(by=['Country', 'Year'], ascending=[True, False]).reset_index(drop=True)
B. df.sort_index(level=['Country', 'Year'], ascending=[True, False]).reset_index()
C. df.sort_index(level=['Country', 'Year'], ascending=[False, True]).reset_index()
D. df.sort_values(by=['Year', 'Country'], ascending=[False, True]).reset_index()

Solution

  1. Step 1: Choose correct sorting method for MultiIndex

    Use sort_index() with levels and ascending list to sort MultiIndex properly.
  2. Step 2: Reset index to flatten DataFrame

    Calling reset_index() converts MultiIndex to columns, preserving sorted order.
  3. Final Answer:

    df.sort_index(level=['Country', 'Year'], ascending=[True, False]).reset_index() -> Option B
  4. Quick Check:

    sort_index with levels + reset_index = correct approach [OK]
Hint: Use sort_index with ascending list, then reset_index [OK]
Common Mistakes:
  • Using sort_values instead of sort_index for MultiIndex
  • Wrong ascending order for levels
  • Forgetting to reset index after sorting
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard