Creating a dataframe with multi-index columns from a dictionary

Viewed 68

Suppose I have the following:

  1. a data frame with multi-index columns

  2. a dictionary that's been created from the data frame with multi-index columns in order to efficiently manipulate it.

    df = pd.DataFrame([
             [100,90,80,70,36,45], 
             [101,78,65,88,55,78], 
             [92,77,42,79,43,32], 
             [103,98,76,54,45,65]], 
             index = pd.date_range(start='2022-01-01', periods=4)
    )
    
    df.columns = pd.MultiIndex.from_tuples(
            (("mkf", "Open"), 
             ("mkf", "Close"), 
             ("tdf", "Open"), 
             ("tdf","Close"), 
             ("ghi","Open"), 
             ("ghi", "Close"))
    )
    df
                mkf        tdf        ghi
               Open Close Open Close Open Close
    2022-01-01  100    90   80    70   36    45
    2022-01-02  101    78   65    88   55    78
    2022-01-03   92    77   42    79   43    32
    2022-01-04  103    98   76    54   45    65
    
    df_dict = {c:df[c].assign(r=np.log(df[(c, 'Close')]).diff()) for c in df.columns.levels[0]}
    
    df_dict
    {'ghi':             Open  Close         r
     2022-01-01    36     45       NaN
     2022-01-02    55     78  0.550046
     2022-01-03    43     32 -0.890973
     2022-01-04    45     65  0.708651,
     'mkf':             Open  Close         r
     2022-01-01   100     90       NaN
     2022-01-02   101     78 -0.143101
     2022-01-03    92     77 -0.012903
     2022-01-04   103     98  0.241162,
     'tdf':             Open  Close         r
     2022-01-01    80     70       NaN
     2022-01-02    65     88  0.228842
     2022-01-03    42     79 -0.107889
     2022-01-04    76     54 -0.380464}
    

What is the best way to transform the dictionary back to a data frame in its original form (i.e. with multi-index columns)?

            mkf               tdf              ghi
           Open Close  r     Open Close  r    Open Close r
2022-01-01  100    90  NaN    80    70   NaN   36    45  NaN
2022-01-02  101    78  0.55   65    88  -0.14  55    78  0.23
2022-01-03   92    77 -0.89   42    79  -0.12  43    32 -0.10
2022-01-04  103    98  0.71   76    54   0.24  45    65 -0.38
1 Answers
    pd.concat([df_dict[c] for c in df_dict.keys()], axis = 1, 
keys = df_dict.keys()) 

            ghi                  mkf                  tdf
           Open Close         r Open Close         r Open Close         r
2022-01-01   36    45       NaN  100    90       NaN   80    70       NaN
2022-01-02   55    78  0.550046  101    78 -0.143101   65    88  0.228842
2022-01-03   43    32 -0.890973   92    77 -0.012903   42    79 -0.107889
2022-01-04   45    65  0.708651  103    98  0.241162   76    54 -0.380464
Related