Pandas index column title or name

How do I get the index column name in python pandas? Here's an example dataframe:

 Column 1 Index Title Apples 1 Oranges 2 Puppies 3 Ducks 4 

What I'm trying to do is get/set the dataframe index title. Here is what i tried:

import pandas as pd data = {'Column 1' : [1., 2., 3., 4.], 'Index Title' : ["Apples", "Oranges", "Puppies", "Ducks"]} df = pd.DataFrame(data) df.index = df["Index Title"] del df["Index Title"] print df 

Anyone know how to do this?

9 Answers

You can just get/set the index via its name property

In [7]: df.index.name Out[7]: 'Index Title' In [8]: df.index.name = 'foo' In [9]: df.index.name Out[9]: 'foo' In [10]: df Out[10]: Column 1 foo Apples 1 Oranges 2 Puppies 3 Ducks 4 
6

You can use rename_axis, for removing set to None:

d = {'Index Title': ['Apples', 'Oranges', 'Puppies', 'Ducks'],'Column 1': [1.0, 2.0, 3.0, 4.0]} df = pd.DataFrame(d).set_index('Index Title') print (df) Column 1 Index Title Apples 1.0 Oranges 2.0 Puppies 3.0 Ducks 4.0 print (df.index.name) Index Title print (df.columns.name) None 

The new functionality works well in method chains.

df = df.rename_axis('foo') print (df) Column 1 foo Apples 1.0 Oranges 2.0 Puppies 3.0 Ducks 4.0 

You can also rename column names with parameter axis:

d = {'Index Title': ['Apples', 'Oranges', 'Puppies', 'Ducks'],'Column 1': [1.0, 2.0, 3.0, 4.0]} df = pd.DataFrame(d).set_index('Index Title').rename_axis('Col Name', axis=1) print (df) Col Name Column 1 Index Title Apples 1.0 Oranges 2.0 Puppies 3.0 Ducks 4.0 print (df.index.name) Index Title print (df.columns.name) Col Name 
print df.rename_axis('foo').rename_axis("bar", axis="columns") bar Column 1 foo Apples 1.0 Oranges 2.0 Puppies 3.0 Ducks 4.0 print df.rename_axis('foo').rename_axis("bar", axis=1) bar Column 1 foo Apples 1.0 Oranges 2.0 Puppies 3.0 Ducks 4.0 

From version pandas 0.24.0+ is possible use parameter index and columns:

df = df.rename_axis(index='foo', columns="bar") print (df) bar Column 1 foo Apples 1.0 Oranges 2.0 Puppies 3.0 Ducks 4.0 

Removing index and columns names means set it to None:

df = df.rename_axis(index=None, columns=None) print (df) Column 1 Apples 1.0 Oranges 2.0 Puppies 3.0 Ducks 4.0 

If MultiIndex in index only:

mux = pd.MultiIndex.from_arrays([['Apples', 'Oranges', 'Puppies', 'Ducks'], list('abcd')], names=['index name 1','index name 1']) df = pd.DataFrame(np.random.randint(10, size=(4,6)), index=mux, columns=list('ABCDEF')).rename_axis('col name', axis=1) print (df) col name A B C D E F index name 1 index name 1 Apples a 5 4 0 5 2 2 Oranges b 5 8 2 5 9 9 Puppies c 7 6 0 7 8 3 Ducks d 6 5 0 1 6 0 

print (df.index.name) None print (df.columns.name) col name print (df.index.names) ['index name 1', 'index name 1'] print (df.columns.names) ['col name'] 

df1 = df.rename_axis(('foo','bar')) print (df1) col name A B C D E F foo bar Apples a 5 4 0 5 2 2 Oranges b 5 8 2 5 9 9 Puppies c 7 6 0 7 8 3 Ducks d 6 5 0 1 6 0 df2 = df.rename_axis('baz', axis=1) print (df2) baz A B C D E F index name 1 index name 1 Apples a 5 4 0 5 2 2 Oranges b 5 8 2 5 9 9 Puppies c 7 6 0 7 8 3 Ducks d 6 5 0 1 6 0 df2 = df.rename_axis(index=('foo','bar'), columns='baz') print (df2) baz A B C D E F foo bar Apples a 5 4 0 5 2 2 Oranges b 5 8 2 5 9 9 Puppies c 7 6 0 7 8 3 Ducks d 6 5 0 1 6 0 

Removing index and columns names means set it to None:

df2 = df.rename_axis(index=(None,None), columns=None) print (df2) A B C D E F Apples a 6 9 9 5 4 6 Oranges b 2 6 7 4 3 5 Puppies c 6 3 6 3 5 1 Ducks d 4 9 1 3 0 5 

For MultiIndex in index and columns is necessary working with .names instead .name and set by list or tuples:

mux1 = pd.MultiIndex.from_arrays([['Apples', 'Oranges', 'Puppies', 'Ducks'], list('abcd')], names=['index name 1','index name 1']) mux2 = pd.MultiIndex.from_product([list('ABC'), list('XY')], names=['col name 1','col name 2']) df = pd.DataFrame(np.random.randint(10, size=(4,6)), index=mux1, columns=mux2) print (df) col name 1 A B C col name 2 X Y X Y X Y index name 1 index name 1 Apples a 2 9 4 7 0 3 Oranges b 9 0 6 0 9 4 Puppies c 2 4 6 1 4 4 Ducks d 6 6 7 1 2 8 

Plural is necessary for check/set values:

print (df.index.name) None print (df.columns.name) None print (df.index.names) ['index name 1', 'index name 1'] print (df.columns.names) ['col name 1', 'col name 2'] 

df1 = df.rename_axis(('foo','bar')) print (df1) col name 1 A B C col name 2 X Y X Y X Y foo bar Apples a 2 9 4 7 0 3 Oranges b 9 0 6 0 9 4 Puppies c 2 4 6 1 4 4 Ducks d 6 6 7 1 2 8 df2 = df.rename_axis(('baz','bak'), axis=1) print (df2) baz A B C bak X Y X Y X Y index name 1 index name 1 Apples a 2 9 4 7 0 3 Oranges b 9 0 6 0 9 4 Puppies c 2 4 6 1 4 4 Ducks d 6 6 7 1 2 8 df2 = df.rename_axis(index=('foo','bar'), columns=('baz','bak')) print (df2) baz A B C bak X Y X Y X Y foo bar Apples a 2 9 4 7 0 3 Oranges b 9 0 6 0 9 4 Puppies c 2 4 6 1 4 4 Ducks d 6 6 7 1 2 8 

Removing index and columns names means set it to None:

df2 = df.rename_axis(index=(None,None), columns=(None,None)) print (df2) A B C X Y X Y X Y Apples a 2 0 2 5 2 0 Oranges b 1 7 5 5 4 8 Puppies c 2 4 6 3 6 5 Ducks d 9 6 3 9 7 0 

And @Jeff solution:

df.index.names = ['foo','bar'] df.columns.names = ['baz','bak'] print (df) baz A B C bak X Y X Y X Y foo bar Apples a 3 4 7 3 3 3 Oranges b 1 2 5 8 1 0 Puppies c 9 6 3 9 6 3 Ducks d 3 2 1 0 1 0 
4

df.index.name should do the trick.

Python has a dir function that let's you query object attributes. dir(df.index) was helpful here.

0

Use df.index.rename('foo', inplace=True) to set the index name.

Seems this api is available since pandas 0.13.

1

If you do not want to create a new row but simply put it in the empty cell then use:

df.columns.name = 'foo' 

Otherwise use:

df.index.name = 'foo' 
1

Setting the index name can also be accomplished at creation:

pd.DataFrame(data={'age': [10,20,30], 'height': [100, 170, 175]}, index=pd.Series(['a', 'b', 'c'], name='Tag')) 

df.columns.values also give us the column names

The solution for multi-indexes is inside jezrael's cyclopedic answer, but it took me a while to find it so I am posting a new answer:

df.index.names gives the names of a multi-index (as a Frozenlist).

To just get the index column names df.index.names will work for both a single Index or MultiIndex as of the most recent version of pandas.

As someone who found this while trying to find the best way to get a list of index names + column names, I would have found this answer useful:

names = list(filter(None, df.index.names + df.columns.values.tolist())) 

This works for no index, single column Index, or MultiIndex. It avoids calling reset_index() which has an unnecessary performance hit for such a simple operation. I'm surprised there isn't a built in method for this (that I've come across). I guess I run into needing this more often because I'm shuttling data from databases where the dataframe index maps to a primary/unique key, but is really just another column to me.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like