Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rename columns in PANDAS based on dictionary

I have a dataframe and I would like to rename the columns based on another dataframe that I plan to use as dictionary. For example, what I have as first dataframe is:

          AAA   BBB   CCC   DDD
 index   
  1       1     2     3     4
  2       5     6     7     8

and as a second dataframe that I would like to use as dictionary:

           val1    val2
  index
    1      AAA      A7
    2      BBB      B0
    3      CCC      C3
    4      DDD      D1

What I would like to get as result is the following:

          A7    B0    C3    D1 
 index   
  1       1     2     3     4
  2       5     6     7     8

Initially I thought to reshape the first dataframe to long format, then merge with the dictionary dataframe and then reshape back to wide format. However I think this is quite inefficient, so I would like to use a more efficient way (if one exists). Thank you very much four your help.

like image 359
km1234 Avatar asked Apr 10 '16 15:04

km1234


People also ask

How do I rename a specific column in Pandas?

Pandas Rename Single Column If you want to rename a single column, just pass the single key-value pair in the columns dict parameter. The result will be the same if there is a non-matching mapping in the columns dictionary.

How do I rename a column in Pandas based on index?

You can rename pandas DataFrame column name by index (position) using rename() method or by assigning column name to df. columns. values[index] .


2 Answers

df.rename has a parameter called columns that accepts dictionaries:

df.rename(columns=dict(zip(df2["val1"], df2["val2"])))

Out:

    A7  B0  C3  D1
0   1   2   3   4
1   5   6   7   8

It returns a new DataFrame. You can either use inplace=True, or assign it back to the original DataFrame.

like image 104
ayhan Avatar answered Oct 03 '22 20:10

ayhan


I think you can first create dictionary from df2, then create Series from columns of df1 by to_series which you then map using dictionary:

print df1
       AAA  BBB  CCC  DDD
index                    
1        1    2    3    4
2        5    6    7    8

print df2
      val1 val2
index          
1      AAA   A7
2      BBB   B0
3      CCC   C3
4      DDD   D1

d = df2.set_index('val1').to_dict()
print d['val2']
{'AAA': 'A7', 'BBB': 'B0', 'CCC': 'C3', 'DDD': 'D1'}

df1.columns = df1.columns.to_series().map(d['val2'])
print df1
       A7  B0  C3  D1
index                
1       1   2   3   4
2       5   6   7   8
like image 26
jezrael Avatar answered Oct 03 '22 19:10

jezrael