Rename MultiIndex columns in Pandas
You can use pandas.DataFrame.rename()
directly
Say you have the following dataframe
print(df)
a d
b c f
0 1 2 3
1 10 20 30
2 100 200 300
df = df.rename(columns={'f': 'f1', 'd': 'd1'})
print(df)
a d1
b c f1
0 1 2 3
1 10 20 30
2 100 200 300
You see, column name mapper doesn't relate with level.
Say you have the following dataframe
a d
b f f
0 1 2 3
1 10 20 30
2 100 200 300
If you want to rename the f
under a
, you can do
df.columns = df.columns.values
df.columns = pd.MultiIndex.from_tuples(df.rename(columns={('a', 'f'): ('a', 'af')}))
print(df)
a d
b af f
0 1 2 3
1 10 20 30
2 100 200 300
In pandas 0.21.0+
use parameter level=1
:
d = dict(zip(df.columns.levels[1], ["b1", "c1", "f1"]))
print (d)
{'c': 'c1', 'b': 'b1', 'f': 'f1'}
df = df.rename(columns=d, level=1)
print (df)
a d
b1 c1 f1
0 1 2 3
1 10 20 30
2 100 200 300
Use set_levels
:
In [22]:
df.columns.set_levels(['b1','c1','f1'],level=1,inplace=True)
df
Out[22]:
a d
b1 c1 f1
0 1 2 3
1 10 20 30
2 100 200 300
rename
sets the name for the index, it doesn't rename the column names:
In [26]:
df.columns = df.columns.rename("b1", level=1)
df
Out[26]:
a d
b1 b c f
0 1 2 3
1 10 20 30
2 100 200 300
This is why you get the error