2016-12-19 379 views
1

我有以下樞軸表排序上多指標水平大熊貓數據幀

     MQW    MSND   Grand Total  
        Amount($m)  Amount($m)   Amount($m)  
        Total Count  Total Count  Total Count 
Margin Call Date              
2016-12-06   16.99  4  8.50  6  25.50 10 
2016-12-07   11.24  4  8.55  6  19.79 10 
2016-12-08    4.21  5  8.28  6  12.49 11 
2016-12-09   23.29  7  8.08  6  31.37 13 
2016-12-12    0.29  1  8.73  6   9.02  7 
Total    56.03 21  42.14 30  98.18 51 

與結構

多指標(水平= [[U '總計',u'MSND」,u'MQW '],[u'Amount($ m)'],[u'Count',u'Total']],標籤= [[2,2,1,1,0,0],[0,0,0 ,0,0,0],[1,0,1,0,1,0]])

對於我的生活,我無法獲得「計數」和「總計」列來切換位置使用.sortlevel方法而不反轉'MQW','MSND'和'Grand Total'的順序。我也嘗試設置'sort_remaining'= False,但它不起作用。這是我想要得到的。

     MQW    MSND   Grand Total  
        Amount($m)  Amount($m)   Amount($m)  
        Count Total  Count Total  Count Total 
Margin Call Date              
2016-12-06   13.99  4  7.50  6  35.50 10 
2016-12-07    1.24  4  16.55 6   9.79 10 
2016-12-08    7.21  5  0.28  6  22.49 11 
2016-12-09   33.29  7  9.08  6  21.37 13 
2016-12-12    0.29  1  8.73  6   9.02  7 
Total    56.03 21  42.14 30  98.18 51 

任何幫助將不勝感激!

+0

嘗試做df.sort_index(水平= [1,0],軸= 1),如果這不工作,你可能會導致蠻力多指標選擇。不需要手工選擇每一列就可以排序。 –

回答

1

以下解決方案有效。不過,我相信一些更容易的選擇應該是可能的。

首先,創建新的索引反轉的水平這樣的2個標籤:

idx = df.columns 
new_idx1 = idx.set_levels(idx.levels[2][::-1], level=2) 

# or, equivalently, 
# new_idx1 = idx.set_levels(['Total', 'Count'], level=2) 

也許更好的改變標籤的代碼:

new_idx2 = idx.set_labels(labels=[0, 1] * 3, level=2) 

注意,內部結構new_idx2new_idx1不同,儘管它們看起來是相同的。 (中sortlevel應用在他們的結果會有所不同。)

您也可以從頭開始創建一個new_idx與pd.MultiIndexpd.MultiIndex.from_arrayspd.MultiIndex.from_tuples

現在重新索引,例如:

df_sorted = df.reindex(columns=new_idx2) 
df_sorted 
Out[337]: 
        MQW    MSND   Grand Total  
      Amount($m)  Amount($m)   Amount($m)  
       Count Total  Count Total  Count Total 
2016-12-06   4 13.99   6 7.50   10 35.50 
2016-12-07   4 1.24   6 16.55   10 9.79 
2016-12-08   5 7.21   6 0.28   11 22.49 
2016-12-09   7 33.29   6 9.08   13 21.37 
2016-12-12   1 0.29   6 8.73   7 9.02 
Total    21 56.03   30 42.14   51 98.18