Here are a few common ways to convert Pandas MultiIndex values to string or other data type:

(1) Custom conversion per level

df.index.set_levels(midx.levels[0].astype(int), level=0) \
        .set_levels(midx.levels[1].astype(str), level=1) \
        .set_levels(midx.levels[2].astype(int), level=2)

(2) Conversion to single type

for level in range(0, len(midx)-1):
    df.index = df.index.set_levels(midx.levels[level].astype(int), level=level)

Example MultiIndex

import pandas as pd

df = pd.DataFrame(
    {"Grade": ["A", "B", "A", "C"]},
    index=[
        ["11", "11", "12", "12"],
        ["21", "22", "21", "22"],
        ["31", "32", "33", "34"]
    ]
)

data looks like:

Grade
11 21 31 A
22 32 B
12 21 33 A
22 34 C

1: Iterate each MultiIndex Level and convert

We can do custom conversion per level by providing the conversion details explicitly:

df.index = df.index.set_levels(midx.levels[0].astype(int), level=0) \
        .set_levels(midx.levels[1].astype(float), level=1) \
        .set_levels(midx.levels[2].astype(int), level=2)

Result:

MultiIndex([(11, 21.0, 31),
            (11, 22.0, 32),
            (12, 21.0, 33),
            (12, 22.0, 34)],
           )

2: Automatic conversion of MI to single type

To convert all levels of MultiIndex to a single data types we can use combination of set_levels and iteration over each level:

for level in range(0, len(midx)-1):
    df.index = df.index.set_levels(midx.levels[level].astype(int), level=level)

Resources