1

I have a multiIndex pandas dataframe.

                            Issue
                       high  med   low
name   age    empId
Jack    44     Ab1      0     1     0
Bob     34     Ab2      0     0     1
Mike    52     Ab6      1     1     0

When I'm executing df.columns I'm getting the following result:-

MultiIndex(levels=[['Issue'], ['high', 'med', 'low']],
       labels=[[0, 0, 0], [0, 1, 2]])

I'm looking to flatten this dataframe by renaming the Multi_index issue columns.

Expected output df:

name   age    empId  Issue_high  Issue_med  Issue_low
Jack    44     Ab1      0           1         0
Bob     34     Ab2      0           0         1
Mike    52     Ab6      1           1         0

I tried this:

df2 = df.rename(columns={'high':'Issue_high','low':'Issue_low','med':'Issue_med'}, level = 1)

Im getting error. rename() got an unexpected keyword argument "level"

Is there any way to get the output structure?

Edit: By using df.columns = df.columns.map('_'.join) I'm getting

                     Issue_high  Issue_med  Issue_low
name   age    empId  
Jack    44     Ab1      0           1         0
Bob     34     Ab2      0           0         1
Mike    52     Ab6      1           1         0

df.columns
>>> Index(['Issue_high',
   'Issue_med', 'Issue_low'],
  dtype='object')
Community
  • 1
  • 1
Shubham R
  • 7,382
  • 18
  • 53
  • 119

1 Answers1

3

Use Index.map with join if all values are strings:

df.columns = df.columns.map('_'.join)

Or format or f-strings - working with numeric values in levels too:

df.columns = df.columns.map('{0[0]}_{0[1]}'.format)
df.columns = df.columns.map(lambda x: f'{x[0]}_{x[1]}')

Last DataFrame.reset_index for convert MultiIndex in Index to columns:

df = df.reset_index()
print (df)
   name  age empId  Issue_high  Issue_med  Issue_low
0  Jack   44   Ab1           0          1          0
1   Bob   34   Ab2           0          0          1
2  Mike   52   Ab6           1          1          0
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252