2015-02-06 29 views
18

Tôi có một yêu cầu sắp xếp cho mỗi ví dụ bên dưới.Sắp xếp theo cột trong phạm vi nhiều chỉ mục trong gấu trúc

Tôi có cần phải đặt lại_index(), sau đó sắp xếp() và sau đó set_index() hoặc có cách khéo léo để thực hiện việc này không?

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 

Cảm ơn bạn đã trả lời Lưu ý tôi thay đổi dữ liệu hơi:

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) 

tuy nhiên sản lượng là

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

tôi sẽ muốn nó được

idx1 idx2  
1 C  105 
    A  99 
    D  97 
    B  11 

2 A  19 
    D  17 
    B  14 
    C  10 
+0

Các biên tập của câu hỏi này thực sự là rất khó hiểu, một phần b/c câu trả lời sử dụng đầu df và không phải là df đáy. Nó có thể là quá muộn bây giờ, nhưng df hàng đầu nên đã bị xóa vì vậy tất cả mọi người sẽ biết sử dụng df dưới. – JohnE

Trả lời

10

bạn có thể sử dụng sort_index:

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

này kết quả đầu ra:

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

được cập nhật để hiển thị đầu ra – JAB

+0

Xem câu hỏi cập nhật – Dickster

+1

Tôi không chắc chắn có thể sắp xếp theo cấp chỉ mục và cột cùng một lúc. – JAB

6

Bạn cần DataFrame.reset_index, DataFrame.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 - Bạn nói đúng, vì vậy tôi loại bỏ solutiom đầu tiên. – jezrael

3

này loại đầu tiên của cột mong muốn, các khu nghỉ dưỡng ở cấp MultiIndex idx1 chỉ và hoạt động trong tối đa các phiên bản gấu trúc ngày không dùng nữa là kiều sử by.

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

Output:

   col1 
idx1 idx2  
1  C 105 
     B 102 
     A 99 
     D 97 
2  A 19 
     D 17 
     B 14 
     C 10 
Các vấn đề liên quan