Search code examples
pythondataframepivot

Pandas Pivoted Table - How to Pivoting By Multiple Columns


I have following data:

data = {
    'Product': ['Stock', 'Stock','FX', 'FX', 'Stock', 'FX'],
    'Client': ['A', 'A','B', 'C', 'C','D'],
    'Country': ['AU', 'JP','JP', 'HK', 'HK','SG'],
    'Sum': [78, 88, 85,82, 87,99],
    'Comm': [1,2,3,4,5,6]}


  Product Client Country  Sum  Comm
0   Stock      A      AU   78     1
1   Stock      A      JP   88     2
2      FX      B      JP   85     3
3      FX      C      HK   82     4
4   Stock      C      HK   87     5
5      FX      D      SG   99     6

I tried pivot table

pivoted = df_1.pivot_table(
    index=['Client', 'Product'],
    columns='Country',
    values=['Comm', 'Sum'])

and I got the result like this:

               Comm                  Sum                  
Country          AU   HK   JP   SG    AU    HK    JP    SG
Client Product                                            
A      Stock    1.0  NaN  2.0  NaN  78.0   NaN  88.0   NaN
B      FX       NaN  NaN  3.0  NaN   NaN   NaN  85.0   NaN
C      FX       NaN  4.0  NaN  NaN   NaN  82.0   NaN   NaN
       Stock    NaN  5.0  NaN  NaN   NaN  87.0   NaN   NaN
D      FX       NaN  NaN  NaN  6.0   NaN   NaN   NaN  99.0

How could I group it by Country at the top row?

Country         AU        HK        JP       SG            
                Sum Comm  Sum Comm  Sum Comm Sum Comm
Client Product                                            
A      Stock    78.0 1.0  NaN NaN   88.0 2.0 NaN NaN
B      FX       NaN  NaN  NaN Nan   85.0 3.0 NaN NaN 
C      FX       NaN NaN   82.0 4.0  NaN NaN  NaN NaN
       Stock    NaN NaN   87.0 5.0  NaN NaN  NaN NaN
D      FX       NaN NaN   NaN NaN   NaN NaN  99.0 6.0

Does anyone know how do I do it?


Solution

  • You can simply stack and unstack:

    pivoted.stack(0).unstack(-1)
    
    Country          AU         HK         JP         SG      
                   Comm   Sum Comm   Sum Comm   Sum Comm   Sum
    Client Product                                            
    A      Stock    1.0  78.0  NaN   NaN  2.0  88.0  NaN   NaN
    B      FX       NaN   NaN  NaN   NaN  3.0  85.0  NaN   NaN
    C      FX       NaN   NaN  4.0  82.0  NaN   NaN  NaN   NaN
           Stock    NaN   NaN  5.0  87.0  NaN   NaN  NaN   NaN
    D      FX       NaN   NaN  NaN   NaN  NaN   NaN  6.0  99.0