Add level to column from Dictionary

Viewed 119

I have a dataframe on which I'd like to add a level of columns. The correct new level of column can be found using my_dict.

df = pd.DataFrame(index=list('abcde'), data={'A': range(5), 'B': range(5)})
my_dict = {"B": "BB","A": "AA","C": "CC"}

This is what I expect:

Out[92]: 
   A  B
   AA BB
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4

Thanks

2 Answers

You can do df.columns.map then convert to Multiindex

df.columns = pd.MultiIndex.from_arrays((df.columns,df.columns.map(my_dict)))

   A  B
  AA BB
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4

Use Index.map with assign back to columns names by nested lists - if no match get NaN:

df.columns = [df.columns, df.columns.map(my_dict)]
print (df)
   A  B
  AA BB
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4

Solution with rename - if no match get original values:

df.columns = [df.columns, df.rename(columns=my_dict).columns]

df.columns = [df.columns, df.columns]

df = df.rename(columns=my_dict, level=1)

Test for not match:

df = pd.DataFrame(index=list('abcde'), data={'A': range(5), 'B': range(5), 'D': range(5)})
my_dict = {"B": "BB","A": "AA","C": "CC"}


df.columns = [df.columns, df.columns.map(my_dict)]
print (df)
   A  B   D
  AA BB NaN
a  0  0   0
b  1  1   1
c  2  2   2
d  3  3   3
e  4  4   4

df.columns = [df.columns, df.columns]
df = df.rename(columns=my_dict, level=1)

#df.columns = [df.columns, df.rename(columns=my_dict).columns]
print (df)
   A  B  D
  AA BB  D
a  0  0  0
b  1  1  1
c  2  2  2
d  3  3  3
e  4  4  4
Related