Concatenate Pandas columns under new multi-index level

后端 未结 2 1108
逝去的感伤
逝去的感伤 2020-11-30 20:36

Given a dictionary of data frames like:

dict = {\'ABC\': df1, \'XYZ\' : df2}   # of any length...

where each data frame has the same column

相关标签:
2条回答
  • 2020-11-30 20:44

    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.

    0 讨论(0)
  • 2020-11-30 20:53

    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']))
    
    0 讨论(0)
提交回复
热议问题