简体   繁体   中英

python pandas pivot_table column level one wrong name

I have the following table:

       ID    Metric   Level    Level(% Change)    Level(Diff)
Index  
0     2016    A       10          NaN                   NaN
1     2017    A       15          0.5                    5
2     2018    A       20          0.3                    5 
3     2016    B       40          NaN                   NaN
4     2017    B       45          0.2                    5
5     2018    B       50          0.1                    5 

I'd like to get the following:


       A_Level   B_Level  A_Level(% Change) B_Level(% Change) A_Level(Diff) B_Level(Diff)
Index
2016     10        40          NaN               NaN              NaN         NaN    
2017     15        45          0.5               0.2               5           5
2018     20        50          0.3               0.1               5           5

I tried:

df = pd.pivot_table(df, index = 'ID', values = ['Level','Level(% Change)','Level(Diff)'], columns = ['Metric'])

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

However I only get the following table:


        Level_A   Level_B  Level_A   Level_B    Level_A   Level_B
Index    
2016      10        40       NaN       NaN        NaN       NaN
2017      15        45       0.5       0.2         5         5
2018      20        50       0.3       0.1         5         5

Basically data in the pivot is correct but the label in the first level column is wrong. There is only 'Level' while 'Level(% Change)', 'Level(Diff)' are missing. I would also get 'A_Level' instead of 'Level_A'.

Thank you in advance

Use list comprehension with swap a,b and f-strings :

df = pd.pivot_table(df, 
                    index = 'ID', 
                    values = ['Level','Level(% Change)','Level(Diff)'], 
                    columns = ['Metric'])

df.columns = [f'{b}_{a}' for a, ab in df.columns]

Or add DataFrame.swaplevel :

df.columns = df.swaplevel(0,1, axis=1).columns.map('_'.join)

print (df)
      A_Level  B_Level  A_Level(% Change)  B_Level(% Change)  A_Level(Diff)  \
ID                                                                            
2016       10       40                NaN                NaN            NaN   
2017       15       45                0.5                0.2            5.0   
2018       20       50                0.3                0.1            5.0   

      B_Level(Diff)  
ID                   
2016            NaN  
2017            5.0  
2018            5.0  

Alternatively, you could melt the data to do the concatenation,

(df.melt(id_vars=['ID','Metric'])
   .assign(header = lambda x:x.Metric + '_' + x.variable)
   .pivot_table(index='ID', columns='header', values='value'))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM