Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rename MultiIndex columns in Pandas

Tags:

pandas

df = pd.DataFrame([[1,2,3], [10,20,30], [100,200,300]]) df.columns = pd.MultiIndex.from_tuples((("a", "b"), ("a", "c"), ("d", "f"))) df 

returns

     a         d      b    c    f 0    1    2    3 1   10   20   30 2  100  200  300 

and

df.columns.levels[1] 

returns

Index([u'b', u'c', u'f'], dtype='object') 

I want to rename "f" to "e". According to pandas.MultiIndex.rename I run:

df.columns.rename(["b1", "c1", "f1"], level=1) 

But it raises

--------------------------------------------------------------------------- TypeError                                 Traceback (most recent call last) <ipython-input-110-b171a2b5706c> in <module>() ----> 1 df.columns.rename(["b1", "c1", "f1"], level=1)  C:\Users\USERNAME\AppData\Local\Continuum\Miniconda2\lib\site-packages\pandas\indexes\base.pyc in set_names(self, names, level, inplace)     994         if level is not None and not is_list_like(level) and is_list_like(     995                 names): --> 996             raise TypeError("Names must be a string")     997      998         if not is_list_like(names) and level is None and self.nlevels > 1:  TypeError: Names must be a string 

I use Python 2.7.12 |Continuum Analytics, Inc.| (default, Jun 29 2016, 11:07:13) [MSC v.1500 64 bit (AMD64)]' and pandas 0.19.1

like image 991
dinya Avatar asked Dec 19 '16 10:12

dinya


People also ask

How do I change a column from MultiIndex to Pandas?

pandas MultiIndex to ColumnsUse pandas DataFrame. reset_index() function to convert/transfer MultiIndex (multi-level index) indexes to columns. The default setting for the parameter is drop=False which will keep the index values as columns and set the new index to DataFrame starting from zero.

Can we rename column in Pandas?

One way of renaming the columns in a Pandas Dataframe is by using the rename() function. This method is quite useful when we need to rename some selected columns because we need to specify information only for the columns which are to be renamed. Example 1: Rename a single column.


1 Answers

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

like image 144
EdChum Avatar answered Oct 06 '22 13:10

EdChum