Multi-Index (Hierarchical Indexing)

Master Multi-Index in Pandas: Handle Multi-Dimensional Data Like a Pro

Working with hierarchical data is a common requirement in analytics, especially when you want to group your data by multiple dimensions—such as store → department, region → category, or year → quarter.
Pandas offers a powerful feature for this: MultiIndex.

In this post, we’ll walk through a practical MultiIndex example using Pandas + Streamlit, showing how to create, access, manipulate, and restructure multi-level indexed data.

Key Concepts

  • Levels: Each index level represents a different dimension
  • Cross-sections: Extract data from specific index levels
  • Stacking/Unstacking: Reshape data between levels

Let’s make this clearer with an example—using formatted data and some demo data from another scenario.

File: pandas_multiindex_demo.py

1. Creating the Multi-Index DataFrame

We start by defining two index levels:

  • Store (Store A, Store B)
  • Department (Electronics, Clothing)
import pandas as pd
import numpy as np
import streamlit as st
# Creating a Multi-Index DataFrame
arrays = [
    ['Store A', 'Store A', 'Store B', 'Store B'],
    ['Electronics', 'Clothing', 'Electronics', 'Clothing']
]
index = pd.MultiIndex.from_arrays(arrays, names=['Store', 'Department'])

data = {
    'Q1_Sales': [50000, 30000, 45000, 28000],
    'Q2_Sales': [55000, 32000, 48000, 30000],
    'Q3_Sales': [60000, 35000, 50000, 31000]
}

df = pd.DataFrame(data, index=index)
st.subheader("Multi-Index DataFrame:")
st.write(df)

A table like this (MultiIndex by Store and Department):

~/chatboat_gen$ streamlit run pandas_multiindex_demo.py

2. Accessing data for Store A

# Accessing data using multi-index
st.subheader("Store A data:")
st.write(df.loc['Store A'])

This filters the first level of the index (Store == 'Store A').

3. Accessing Store B, Electronics

# Accessing specific combination
st.subheader("Store B, Electronics:")
st.write(df.loc[('Store B', 'Electronics')])

This selects one specific combination of the MultiIndex

4. Cross-section: all Electronics departments

# Cross-section (xs) - get all Electronics departments
st.subheader("All Electronics departments:")
st.write(df.xs('Electronics', level='Department'))

xs takes a cross-section at Department == 'Electronics'.

Output:

5. Swapping index levels

# Swapping index levels
st.subheader("Swapped index levels:")
st.write(df.swaplevel())

Now the index order becomes: DepartmentStore.

Output:

6. Sorting by Department then Store

# Sorting by index
st.subheader("Sorted by Department then Store:")
st.write(df.swaplevel().sort_index())

First it swaps levels (Department first), then sorts the index.
Output:

7. Resetting the index

# Reset index to regular columns
df_reset = df.reset_index()
st.subheader("Reset index:")
st.write(df_reset)

This turns the MultiIndex into normal columns.

Output:

8. Re-creating the MultiIndex from columns

# Set multi-index from columns
df_multi = df_reset.set_index(['Store', 'Department'])
st.subheader("Re-created multi-index:")
st.write(df_multi)

This just goes back to the original MultiIndex structure:

Conclusion

MultiIndex is one of Pandas’ most powerful features for analyzing complex datasets.
With just a few lines of code, you can:

  • Build hierarchical indexes
  • Slice data cleanly
  • Reorder and sort index levels
  • Convert between indexed and flat structures

And using Streamlit, you can transform these examples into interactive data exploration tools in minutes.