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)