Topics in this subject
Pandas 1 min read Updated 4 Aug 2026

12. MultiIndex (hierarchical index)

idx = pd.MultiIndex.fromtuples(

idx = pd.MultiIndex.from_tuples(
    [('Eng','M'),('Eng','F'),('Sales','M')],
    names=['dept','gender'])
s = pd.Series([90, 85, 60], index=idx)

s['Eng']                 # all Eng rows
s.loc[('Eng','F')]       # single value
s.loc[('Eng',):('Sales',)]

df.set_index(['dept','gender'])   # create MultiIndex
df.sort_index()                    # required for efficient slicing
df.reset_index()                   # flatten back to columns
s.xs('M', level='gender')          # cross-section by a level
Operation Method
Create set_index([...]), MultiIndex.from_*
Select loc[(a,b)], xs(key, level=)
Sort sort_index() (needed for slicing)
Reset reset_index()

⚠️ Common Mistake: Slicing an unsorted MultiIndex raises UnsortedIndexError. Call df.sort_index() first.

Interview Question: What is a MultiIndex used for? Representing higher-dimensional data in a 2-D frame — e.g. (dept, gender) rows — enabling grouped selection and easy pivot/stack operations.