2015-02-06 100 views
18

我對以下每個示例都有一個排序請求。在pandas的多索引級別內按列排序

我需要reset_index(),然後排序(),然後set_index()或是否有一個光滑的方式來做到這一點?

l = [[1,'A',99],[1,'B',102],[1,'C',105],[1,'D',97],[2,'A',19],[2,'B',14],[2,'C',10],[2,'D',17]] 
df = pd.DataFrame(l,columns = ['idx1','idx2','col1']) 
df.set_index(['idx1','idx2'],inplace=True) 

# assume data has been received like this... 
print df 

      col1 
idx1 idx2  
1 A  99 
    B  102 
    C  105 
    D  97 
2 A  19 
    B  14 
    C  10 
    D  17 

# I'd like to sort descending on col1, partitioning within index level = 'idx2' 

      col1 
idx1 idx2  
1 C  105 
    B  102 
    A  99 
    D  97 

2 A  19 
    D  17 
    B  14 
    C  10 

謝謝你的答案 注意我會稍有改變的數據:

l = [[1,'A',99],[1,'B',11],[1,'C',105],[1,'D',97],[2,'A',19],[2,'B',14],[2,'C',10],[2,'D',17]] 
df = pd.DataFrame(l,columns = ['idx1','idx2','col1']) 
df.set_index(['idx1','idx2'],inplace=True) 
df = df.sort_index(by='col1', ascending=False) 

但是輸出

idx1 idx2  
1 C  105 
    A  99 
    D  97 
2 A  19 
    D  17 
    B  14 
1 B  11 
2 C  10 

我會希望它是

idx1 idx2  
1 C  105 
    A  99 
    D  97 
    B  11 

2 A  19 
    D  17 
    B  14 
    C  10 
+0

這個問題的編輯實際上是非常混亂的,部分B/C的答案使用頂部DF和不是底部DF。現在可能已經太晚了,但是頂部df應該已經被刪除了,所以每個人都會知道使用底部df。 – JohnE 2017-07-12 12:49:54

回答

10

您可以使用sort_index

df.sort_index(by='col1', ascending=False) 

此輸出:通過所需的列

   col1 
idx1 idx2  
1  C 105 
     B 102 
     A 99 
     D 97 
2  A 19 
     D 17 
     B 14 
     C 10 
+0

已更新爲顯示輸出 – JAB 2015-02-06 20:20:52

+0

查看更新的問題 – Dickster 2015-02-09 11:49:45

+1

我不確定是否可以同時按索引級別和列進行排序。 – JAB 2015-02-09 15:05:17

6

你需要DataFrame.reset_indexDataFrame.sort_valuesDataFrame.set_index ::

l = [[1,'A',99],[1,'B',11],[1,'C',105],[1,'D',97], 
    [2,'A',19],[2,'B',14],[2,'C',10],[2,'D',17]] 
df = pd.DataFrame(l,columns = ['idx1','idx2','col1']) 
df.set_index(['idx1','idx2'],inplace=True) 
print (df) 
      col1 
idx1 idx2  
1 A  99 
    B  11 
    C  105 
    D  97 
2 A  19 
    B  14 
    C  10 
    D  17 

df = df.reset_index() \ 
     .sort_values(['idx1','col1'], ascending=[True,False]) \ 
     .set_index(['idx1','idx2']) 
print (df) 
      col1 
idx1 idx2  
1 C  105 
    A  99 
    D  97 
    B  11 
2 A  19 
    D  17 
    B  14 
    C  10 
+1

@JohnE - 您是對的,所以我刪除了第一個解決方案。 – jezrael 2017-07-12 13:05:14

3

這第一個排序,度假村僅適用於idx1 MultiIndex級別,並且工作於最高級別最新的熊貓版本,不贊成kwarg。

df.sort_values('col1', ascending=False).sort_index(level='idx1', sort_remaining=False) 

輸出:

   col1 
idx1 idx2  
1  C 105 
     B 102 
     A 99 
     D 97 
2  A 19 
     D 17 
     B 14 
     C 10