Я не могу сказать, пытаетесь ли вы переименовать MultiIndex столбцы или MultiIndex имена , поэтому я могу указать, как это сделать для обоих. Я также не смог получить DataFrame из предоставленных вами данных, так что вот фальшивый набор:
>>> arrays = [np.array(['bar 1', 'bar 1', 'baz 2', 'baz 2', 'foo 3', 'foo 3', 'qux 4', 'qux 4']), np.array(['one a', 'two b', 'one a', 'two b', 'one a', 'two b', 'one a', 'two b'])]
>>> df = pd.DataFrame(np.random.randn(8, 4), index=arrays)
>>> df.index
MultiIndex(levels=[['bar 1', 'baz 2', 'foo 3', 'qux 4'], ['one a', 'two b']],
labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]])
>>> df.index.names
FrozenList([None, None])
Здесь вы создаете новый MultiIndex с пониманием вложенного списка и заменяете нужные символы
>>> new_mi = pd.MultiIndex(levels=[[col.replace(' ', '_') for col in lvl] for lvl in df.index.levels], labels=df.index.labels)
>>> new_mi
MultiIndex(levels=[['bar_1', 'baz_2', 'foo_3', 'qux_4'], ['one_a', 'two_b']],
labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]])
>>> df.index = new_mi
>>> df.index
MultiIndex(levels=[['bar_1', 'baz_2', 'foo_3', 'qux_4'], ['one_a', 'two_b']],
labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]])
Если вы пытаетесь изменить имена MultiIndex, просто сделайте это для имен:
# set up names to be strings with spaces
>>> df.index.names = ['name 1', 'name 2']
>>> df.index.names
FrozenList(['name 1', 'name 2'])
# replace spaces with underscore
>>> df.index.names = [_name.replace(' ', '_') for _name in df.index.names]
>>> df.index.names
FrozenList(['name_1', 'name_2'])