Renaming the column names of pandas dataframe is not working as expected – python

Question:

I am having below pandas dataframe df. I am trying to rename the column names but it not working as expected.

Code:

 mapping = {df.columns[0]:'Date', df.columns[1]: 'A', df.columns[2]:'B', df.columns[3]: 'C',df.columns[4]:'D', df.columns[5]: 'E',df.columns[6]:'F', df.columns[7]: 'G',df.columns[8]:'H', df.columns[9]: 'J'}
 df.rename(columns=mapping) 

Output of df.columns:

MultiIndex(levels=[['A Index', 'B Index', 'C Index', 'D Index', 'E Index', 'F Index', 'G Index', 'H Index', 'I Index', 'J Index', 'K Index', 'L Index', 'M Index', 'N Index', 'O Index', 'date', 'index'], ['PX_LAST', '']],
       labels=[[16, 15, 11, 9, 10, 6, 3, 4, 2, 5, 14, 1, 13, 12, 7, 0, 8], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
       names=['ticker', 'field'])

Even after running the code, column name stays the same. Can anyone help rename column names of this dataframe.

Asked By: Arvinth Kumar

||

Answers:

Because you know the order of the columns already why not just use:

df.columns = ['Date', 'a', 'b', 'c', 'd', 'e', 'f' 'g', 'h', 'i', 'j']

Otherwise if you want to use rename you will need to assign it to a variable:

 mapping = {df.columns[0]:'Date', df.columns[1]: 'A', df.columns[2]:'B', df.columns[3]: 'C',df.columns[4]:'D', df.columns[5]: 'E',df.columns[6]:'F', df.columns[7]: 'G',df.columns[8]:'H', df.columns[9]: 'J'}
 df = df.rename(columns=mapping)
Answered By: johnchase

Adding inplace=True to the rename call will work.

Though, I’m not sure what the result is if I don’t specify inplace=True, since I don’t see any change.

Answered By: Wolfgang Sprick

Pandas version < 1.4.3

Given the previous documentation from pandas, the default value on axis parameter is 0 (meaning index).

Thus, changing your command to:

df.rename(columns = mapping, axis = 1)

, where axis equal to 1 means columns, will work as expected.

Also, as mentioned before, you can use the inplace = True so you won’t have to reassign your updated DataFrame.

Pandas version >= 1.4.3 (thanks @Gordon for the heads-up)

You can just use:

df.rename(columns = mapping)

With the new update (see documentation), pandas understand that when you set a mapping to columns parameter, you mean to change the value of columns (as it is logical to happen); thus, the axis parameter is unnecessary.

As noted previously, you can also use the inplace = True so you won’t have to reassign your updated DataFrame.

Answered By: zoumpp