Concatenate Pandas columns under new multi-index level Concatenate Pandas columns under new multi-index level python python

Concatenate Pandas columns under new multi-index level


You can do it with concat (the keys argument will create the hierarchical columns index):

d = {'ABC' : df1, 'XYZ' : df2}print pd.concat(d.values(), axis=1, keys=d.keys())                XYZ                                          ABC           \               Open     High      Low    Close   Volume     Open     High   Date                                                                        2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833  0.18077  0.18800   2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866  0.18439  0.21331   2002-01-21  0.19523  0.20970  0.19162  0.20608   771149  0.19523  0.20970                   Low    Close   Volume  Date                                   2002-01-17  0.16993  0.18439  1720833  2002-01-18  0.18077  0.19523  2027866  2002-01-21  0.19162  0.20608   771149

Really concat wants lists so the following is equivalent:

print(pd.concat([df1, df2], axis=1, keys=['ABC', 'XYZ']))


Add a symbol column to your dataframes and set the index to include the symbol column, concat and then unstack that level:

The following assumes that there are as many symbols as DataFrames in your dict, and also that you check that the order of symbols is as you want it based on the order of the dict keys:

DF_dict = {'ABC': df1, 'XYZ' : df2} dict_keys = DF_dict.keys()symbols = ['ABC', 'ZXY']for x in xrange(len(symbols)):    DF_dict[dict_keys[x]]['symbol'] = symbols[x]    DF_dict[dict_keys[x]].reset_index(inplace = True)    DF_dict[dict_keys[x]].set_index(['symbol', 'Date'], inplace = True)DF = pd.concat(DF_dict[df] for df in dict_keys)DF = DF.unstack('symbol')

I think that would be the approach I would take. Some people are against the inplace syntax. I use it here only as convenience.