8

Given two different df's:

'A'

            a  b         
2016-11-21  2  1
2016-11-22  3  4
2016-11-23  5  2 
2016-11-24  6  3 
2016-11-25  6  3

'B'

            a  b         
2016-11-21  3  0
2016-11-22  1  0
2016-11-23  1  6 
2016-11-24  1  5 
2016-11-25  0  2

How can I create a 'multilevel' dataframe of this shape:

'C'

            A     B
            a  b  a  b           
2016-11-21  2  1  3  0
2016-11-22  3  4  1  0
2016-11-23  5  2  1  6
2016-11-24  6  3  1  5
2016-11-25  6  3  0  2

*index is a 'datatime' object

Thanks

hernanavella
  • 5,462
  • 8
  • 47
  • 84

2 Answers2

11

One option is to use MultiIndex() to construct the columns level for A and B and then concatenate them:

import pandas as pd
A.columns = pd.MultiIndex.from_product([['A'], A.columns])
B.columns = pd.MultiIndex.from_product([['B'], B.columns])
pd.concat([A, B], axis = 1)

#           A       B
#           a   b   a   b
#2016-11-21 2   1   3   0
#2016-11-22 3   4   1   0
#2016-11-23 5   2   1   6
#2016-11-24 6   3   1   5
#2016-11-25 6   3   0   2
Psidom
  • 209,562
  • 33
  • 339
  • 356
  • Why not just use MultiIndex.from_product() once on the resultant df? result = pd.concat([A, B], axis=1) result.columns = pd.MultiIndex.from_product([('A', 'B'), A.columns]) – Alex Nov 26 '16 at 18:46
  • Also why isn't the first level of your columnar multi-index aligned the way it is in jezrael's answer? – Alex Nov 26 '16 at 18:51
  • If the two data frames have different dimensions or different column names, use MultiIndex on the result won't work. The first level is aligned the same way as jezrael's answer, if you check the answer. I probably have indented differently here. – Psidom Nov 26 '16 at 18:55
11

You can use concat with parameter keys:

df = pd.concat([A, B], axis = 1, keys=(list('AB')))
print (df)
            A     B   
            a  b  a  b
2016-11-21  2  1  3  0
2016-11-22  3  4  1  0
2016-11-23  5  2  1  6
2016-11-24  6  3  1  5
2016-11-25  6  3  0  2
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252