You can rename (change) column/index names of pandas. DataFrame by using rename() , add_prefix() , add_suffix() , set_axis() methods or updating the columns / index attributes. You can also rename index names (labels) of pandas. Series in the same way.
To reset the index in pandas, you simply need to chain the function . reset_index() with the dataframe object. On applying the . reset_index() function, the index gets shifted to the dataframe as a separate column.
To rename index values of pandas DataFrame use rename() method or index attribute.
The rename
method takes a dictionary for the index which applies to index values.
You want to rename to index level's name:
df.index.names = ['Date']
A good way to think about this is that columns and index are the same type of object (Index
or MultiIndex
), and you can interchange the two via transpose.
This is a little bit confusing since the index names have a similar meaning to columns, so here are some more examples:
In [1]: df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC'))
In [2]: df
Out[2]:
A B C
0 1 2 3
1 4 5 6
In [3]: df1 = df.set_index('A')
In [4]: df1
Out[4]:
B C
A
1 2 3
4 5 6
You can see the rename on the index, which can change the value 1:
In [5]: df1.rename(index={1: 'a'})
Out[5]:
B C
A
a 2 3
4 5 6
In [6]: df1.rename(columns={'B': 'BB'})
Out[6]:
BB C
A
1 2 3
4 5 6
Whilst renaming the level names:
In [7]: df1.index.names = ['index']
df1.columns.names = ['column']
Note: this attribute is just a list, and you could do the renaming as a list comprehension/map.
In [8]: df1
Out[8]:
column B C
index
1 2 3
4 5 6
The currently selected answer does not mention the rename_axis
method which can be used to rename the index and column levels.
Pandas has some quirkiness when it comes to renaming the levels of the index. There is also a new DataFrame method rename_axis
available to change the index level names.
Let's take a look at a DataFrame
df = pd.DataFrame({'age':[30, 2, 12],
'color':['blue', 'green', 'red'],
'food':['Steak', 'Lamb', 'Mango'],
'height':[165, 70, 120],
'score':[4.6, 8.3, 9.0],
'state':['NY', 'TX', 'FL']},
index = ['Jane', 'Nick', 'Aaron'])
This DataFrame has one level for each of the row and column indexes. Both the row and column index have no name. Let's change the row index level name to 'names'.
df.rename_axis('names')
The rename_axis
method also has the ability to change the column level names by changing the axis
parameter:
df.rename_axis('names').rename_axis('attributes', axis='columns')
If you set the index with some of the columns, then the column name will become the new index level name. Let's append to index levels to our original DataFrame:
df1 = df.set_index(['state', 'color'], append=True)
df1
Notice how the original index has no name. We can still use rename_axis
but need to pass it a list the same length as the number of index levels.
df1.rename_axis(['names', None, 'Colors'])
You can use None
to effectively delete the index level names.
Let's create a Series with three index levels
s = df.set_index(['state', 'color'], append=True)['food']
s
state color
Jane NY blue Steak
Nick TX green Lamb
Aaron FL red Mango
Name: food, dtype: object
We can use rename_axis
similarly to how we did with DataFrames
s.rename_axis(['Names','States','Colors'])
Names States Colors
Jane NY blue Steak
Nick TX green Lamb
Aaron FL red Mango
Name: food, dtype: object
Notice that the there is an extra piece of metadata below the Series called Name
. When creating a Series from a DataFrame, this attribute is set to the column name.
We can pass a string name to the rename
method to change it
s.rename('FOOOOOD')
state color
Jane NY blue Steak
Nick TX green Lamb
Aaron FL red Mango
Name: FOOOOOD, dtype: object
DataFrames do not have this attribute and infact will raise an exception if used like this
df.rename('my dataframe')
TypeError: 'str' object is not callable
Prior to pandas 0.21, you could have used rename_axis
to rename the values in the index and columns. It has been deprecated so don't do this
pandas
versionsdf.index = df.index.rename('new name')
or
df.index.rename('new name', inplace=True)
The latter is required if a data frame should retain all its properties.
In Pandas version 0.13 and greater the index level names are immutable (type FrozenList
) and can no longer be set directly. You must first use Index.rename()
to apply the new index level names to the Index and then use DataFrame.reindex()
to apply the new index to the DataFrame. Examples:
For Pandas version < 0.13
df.index.names = ['Date']
For Pandas version >= 0.13
df = df.reindex(df.index.rename(['Date']))
You can also use Index.set_names
as follows:
In [25]: x = pd.DataFrame({'year':[1,1,1,1,2,2,2,2],
....: 'country':['A','A','B','B','A','A','B','B'],
....: 'prod':[1,2,1,2,1,2,1,2],
....: 'val':[10,20,15,25,20,30,25,35]})
In [26]: x = x.set_index(['year','country','prod']).squeeze()
In [27]: x
Out[27]:
year country prod
1 A 1 10
2 20
B 1 15
2 25
2 A 1 20
2 30
B 1 25
2 35
Name: val, dtype: int64
In [28]: x.index = x.index.set_names('foo', level=1)
In [29]: x
Out[29]:
year foo prod
1 A 1 10
2 20
B 1 15
2 25
2 A 1 20
2 30
B 1 25
2 35
Name: val, dtype: int64
For Single Index :
df.index.rename('new_name')
For Multi Index :
df.index.rename(['new_name','new_name2'])
WE can also use this in latest pandas :
If you want to use the same mapping for renaming both columns and index you can do:
mapping = {0:'Date', 1:'SM'}
df.index.names = list(map(lambda name: mapping.get(name, name), df.index.names))
df.rename(columns=mapping, inplace=True)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With