使用对角矩阵将单索引数据帧转换为多索引数据帧

时间:2021-04-21 10:46:21

标签: python pandas dataframe

我有一个名为rolling_vol_monthly的索引DataFrame:

rolling_vol_monthly DataFrame(579 行 × 10 列):

               NoDur    Durbl   Manuf   Enrgy   HiTec   Telcm   Shops   Hlth    Utils   Other
Date                                        
1972-11-30     0.00666  0.00939 0.00803 0.00851 0.01205 0.00799 0.00795 0.00819 0.00505 0.00892
1972-12-31     0.00664  0.00943 0.00800 0.00837 0.01185 0.00792 0.00794 0.00804 0.00504 0.00889

我想将该数据帧转换为:

                     NoDur  Durbl   Manuf   Enrgy   HiTec   Telcm   Shops   Hlth    Utils   Other
Date          lvl1                              
1972-11-30    NoDur  0.006660       0       0       0       0       0       0       0       0
              Durbl  0      0.00939 0       0       0       0       0       0       0       0
              Manuf  0      0       0.00803 0       0       0       0       0       0       0
              Enrgy  0      0       0       0.00851 0       0       0       0       0       0
              HiTec  0      0       0       0       0.01205 0       0       0       0       0
              Telcm  0      0       0       0       0       0.00799 0       0       0       0
              Shops  0      0       0       0       0       0       0.00795 0       0       0
              Hlth   0      0       0       0       0       0       0       0.00819 0       0
              Utils  0      0       0       0       0       0       0       0       0.00505 0
              Other  0      0       0       0       0       0       0       0       0       0.00892
         


                     NoDur  Durbl   Manuf   Enrgy   HiTec   Telcm   Shops   Hlth    Utils   Other
Date          lvl1                              
1972-11-31    NoDur  0.006640       0       0       0       0       0       0       0       0
              Durbl  0      0.00943 0       0       0       0       0       0       0       0
              Manuf  0      0       0.00800 0       0       0       0       0       0       0
              Enrgy  0      0       0       0.00837 0       0       0       0       0       0
              HiTec  0      0       0       0       0.01185 0       0       0       0       0
              Telcm  0      0       0       0       0       0.00792 0       0       0       0
              Shops  0      0       0       0       0       0       0.00794 0       0       0
              Hlth   0      0       0       0       0       0       0       0.00804 0       0
              Utils  0      0       0       0       0       0       0       0       0.00504 0
              Other  0      0       0       0       0       0       0       0       0       0.00889

我试过的代码:

 rvm = rolling_vol_monthly.copy()
 rvm = rvm.groupby(level='Date').apply(lambda g: pd.DataFrame(data = np.diag(g.values) , index = rolling_cov_monthly.index , columns= rolling_vol_monthly.columns))

rolling_cov_monthly 具有所需索引的位置。

1 个答案:

答案 0 :(得分:1)

您需要通过选择第一个值或通过 ravel 来展平值:

f = lambda g: pd.DataFrame(data = np.diag(g.values[0]), 
                           index = rvm.columns,
                           columns= rvm.columns)

或者:

f = lambda g: pd.DataFrame(data = np.diag(g.values.ravel()), 
                           index = rvm.columns, 
                           columns= rvm.columns)

或者您可以通过DataFrame.iloc按位置选择第一个值:

f = lambda g: pd.DataFrame(data = np.diag(g.iloc[0].values), 
                           index = rvm.columns,
                           columns= rvm.columns)
rvm = rvm.groupby(level='Date').apply(f)

print (rvm)
                   NoDur    Durbl    Manuf    Enrgy    HiTec    Telcm  \
Date                                                                     
1972-11-30 NoDur  0.00666  0.00000  0.00000  0.00000  0.00000  0.00000   
           Durbl  0.00000  0.00939  0.00000  0.00000  0.00000  0.00000   
           Manuf  0.00000  0.00000  0.00803  0.00000  0.00000  0.00000   
           Enrgy  0.00000  0.00000  0.00000  0.00851  0.00000  0.00000   
           HiTec  0.00000  0.00000  0.00000  0.00000  0.01205  0.00000   
           Telcm  0.00000  0.00000  0.00000  0.00000  0.00000  0.00799   
           Shops  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000   
           Hlth   0.00000  0.00000  0.00000  0.00000  0.00000  0.00000   
           Utils  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000   
           Other  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000   
1972-12-31 NoDur  0.00664  0.00000  0.00000  0.00000  0.00000  0.00000   
           Durbl  0.00000  0.00943  0.00000  0.00000  0.00000  0.00000   
           Manuf  0.00000  0.00000  0.00800  0.00000  0.00000  0.00000   
           Enrgy  0.00000  0.00000  0.00000  0.00837  0.00000  0.00000   
           HiTec  0.00000  0.00000  0.00000  0.00000  0.01185  0.00000   
           Telcm  0.00000  0.00000  0.00000  0.00000  0.00000  0.00792   
           Shops  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000   
           Hlth   0.00000  0.00000  0.00000  0.00000  0.00000  0.00000   
           Utils  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000   
           Other  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000   

                    Shops     Hlth    Utils    Other  
Date                                                  
1972-11-30 NoDur  0.00000  0.00000  0.00000  0.00000  
           Durbl  0.00000  0.00000  0.00000  0.00000  
           Manuf  0.00000  0.00000  0.00000  0.00000  
           Enrgy  0.00000  0.00000  0.00000  0.00000  
           HiTec  0.00000  0.00000  0.00000  0.00000  
           Telcm  0.00000  0.00000  0.00000  0.00000  
           Shops  0.00795  0.00000  0.00000  0.00000  
           Hlth   0.00000  0.00819  0.00000  0.00000  
           Utils  0.00000  0.00000  0.00505  0.00000  
           Other  0.00000  0.00000  0.00000  0.00892  
1972-12-31 NoDur  0.00000  0.00000  0.00000  0.00000  
           Durbl  0.00000  0.00000  0.00000  0.00000  
           Manuf  0.00000  0.00000  0.00000  0.00000  
           Enrgy  0.00000  0.00000  0.00000  0.00000  
           HiTec  0.00000  0.00000  0.00000  0.00000  
           Telcm  0.00000  0.00000  0.00000  0.00000  
           Shops  0.00794  0.00000  0.00000  0.00000  
           Hlth   0.00000  0.00804  0.00000  0.00000  
           Utils  0.00000  0.00000  0.00504  0.00000  
           Other  0.00000  0.00000  0.00000  0.00889