2014-10-14 4 views
0

레벨 구성을 존중하면서 다중 인덱스 데이터 프레임을 정렬하려면 어떻게해야합니까?인덱스 구조를 존중하면서 다중 인덱스 정렬

예. df 다음 주어진 말 우리는 (예를 들어 내림차순) C에 따라 정렬 :

    C   D E 
A B       
bar one -0.346528 1.528538 1 
    three -0.136710 -0.147842 1 
flux six 0.795641 -1.610137 1 
    three 1.051926 -1.316725 2 
foo five 0.906627 0.717922 0 
    one -0.152901 -0.043107 2 
    two 0.542137 -0.373016 2 
    two 0.329831 1.067820 1 

우리가 가야 :

내가 "인덱스 구조를 존중"는 무엇을 의미하는가
    C   D E 
A B       
bar three -0.136710 -0.147842 1 
    one -0.346528 1.528538 1 
flux three 1.051926 -1.316725 2 
    six 0.795641 -1.610137 1 
foo five 0.906627 0.717922 0 
    two 0.542137 -0.373016 2 
    two 0.329831 1.067820 1 
    two -0.152901 -0.043107 2 

주이다 상위 레벨 인덱스의 순서를 변경하지 않고 데이터 프레임의 리프를 정렬합니다. 즉,의 첫 번째 레벨을 의 순서대로 유지하면서 두 번째 레벨을 정렬하려고합니다.

에서 무엇을하면 어떨까요? 주문?

나는 (예, 같은 제목)이 두 개의 스레드를 읽어

하지만 다른 기준 (예 : 인덱스 이름에 따라 dataframes을 정렬 또는 그룹의 특정 열).

답변

1

.reset_index 다음에 열 AC을 기준으로 정렬 한 다음 인덱스를 다시 설정하십시오. 이는 이전 groupby 솔루션보다 더 효율적입니다 :

>>> df.reset_index().sort(columns=['A', 'C'], ascending=[True, False]).set_index(['A', 'B']) 
       C  D E 
A B      
bar three -0.137 -0.148 1 
    one -0.347 1.529 1 
flux three 1.052 -1.317 2 
    six 0.796 -1.610 1 
foo five 0.907 0.718 0 
    two 0.542 -0.373 2 
    two 0.330 1.068 1 
    one -0.153 -0.043 2 

이전 솔루션 : .groupby(...).apply가 상대적으로 느린, 매우 잘 확장되지 않을 수 있습니다

>>> df['arg-sort'] = df.groupby(level='A')['C'].apply(pd.Series.argsort) 
>>> f = lambda obj: obj.iloc[obj.loc[::-1, 'arg-sort'], :] 
>>> df.groupby(level='A', group_keys=False).apply(f) 
       C  D E arg-sort 
A B        
bar three -0.137 -0.148 1   1 
    one -0.347 1.529 1   0 
flux three 1.052 -1.317 2   1 
    six 0.796 -1.610 1   0 
foo five 0.907 0.718 0   1 
    two 0.542 -0.373 2   2 
    two 0.330 1.068 1   0 
    one -0.153 -0.043 2   3 
+0

감사합니다. 첫 번째 솔루션에서 왜 'C'뿐만 아니라 'A'로 정렬해야합니까? –

+0

@ user815423426 그렇지 않으면 첫 번째 수준의 순서가 느슨해집니다. –