>

MultiIndex (일부 타이밍 통계, "장치", "빌드 구성", "테스트 된 기능"등의 인덱스 레벨이있는 ​​데이터)가있는 데이터가 있습니다. 해당 색인 열 중 일부를 잘라 내고 싶습니다.

.loc 함수에 "슬라이서"가있는 것 같습니다. 그러나 문서 에는 다음 경고가 포함되어 있습니다.

Warning: You will need to make sure that the selection axes are fully lexsorted!

나중에 문서에는 멀티 인덱스에 대한 정렬 필요성 :

you are responsible for ensuring that things are properly sorted

그러나 고맙게도

The MultiIndex object has code to explicity check the sort depth. Thus, if you try to index at a depth at which the index is not sorted, it will raise an exception.

소리가 좋습니다.

나머지 질문은 인덱싱이 제대로 작동하기 위해 데이터를 올바르게 정렬하는 방법은 무엇입니까? 문서는 중요한 새로운 방법 sortlevel() 에 대해 이야기합니다.  하지만 다음과 같은 경고가 있습니다 :

There is an important new method sortlevel to sort an axis within a MultiIndex so that its labels are grouped and sorted by the original ordering of the associated factor at that level. Note that this does not necessarily mean the labels will be sorted lexicographically!

내 경우에는 sortlevel ()이 옳은 일을했지만 "관련 요인의 원래 순서"가 정렬되지 않으면 어떻게됩니까? MultiIndex-ed DataFrame에 사용할 수있는 간단한 단일 라이너가 있습니까? <시간>

편집 : 내 탐색을 통해 MultiIndex를 만드는 대부분의 방법은 인덱스를 만들 때 고유 레이블을 자동으로 분류합니다. 예 :

In [1]: 
import pandas as pd
df = pd.DataFrame({'col1': ['b','d','b','a'], 'col2': [3,1,1,2],
                  'data':['one','two','three','four']})
df
Out[1]: 
  col1  col2   data
0    b     3    one
1    d     1    two
2    b     1  three
3    a     2   four
In [2]:
df2 = df.set_index(['col1','col2'])
df2
Out[2]: 
            data
col1 col2       
b    3       one
d    1       two
b    1     three
a    2      four
In [3]: df2.index
Out[3]: 
MultiIndex(levels=[[u'a', u'b', u'd'], [1, 2, 3]],
           labels=[[1, 2, 1, 0], [2, 0, 0, 1]],
           names=[u'col1', u'col2'])

DataFrame 객체 자체가 아니더라도 levels 배열의 고유 항목이 어떻게 분류되는지 확인하십시오. 그런 다음 예상대로 :

In [4]: df2.index.is_lexsorted()
Out[4]: False
In [5]: 
sorted = df2.sortlevel()
sorted
Out[5]: 
            data
col1 col2       
a    2      four
b    1     three
     3       one
d    1       two
In [6]: sorted.index.is_lexsorted()
Out[6]: True

그러나 레벨이 명시 적으로 정렬되어 정렬되지 않은 경우 상황이 이상해집니다.

In [7]:
df3 = df2
df3.index.set_levels(['b','d','a'], level='col1', inplace=True)
df3.index.set_labels([0,1,0,2], level='col1', inplace=True)
df3
Out[7]: 
            data
col1 col2       
b    3       one
d    1       two
b    1     three
a    2      four
In [8]:
sorted2 = df3.sortlevel()
sorted2
Out[8]: 
            data
col1 col2       
b    1     three
     3       one
d    1       two
a    2      four
In [9]: sorted2.index.is_lexsorted()
Out[9]: True
In [10]: sorted2.index
Out[10]: 
MultiIndex(levels=[[u'b', u'd', u'a'], [1, 2, 3]],
           labels=[[0, 0, 1, 2], [0, 2, 0, 1]],
           names=[u'col1', u'col2'])

그래서 sorted2는 실제로 그렇지 않은 경우 lexsorted라고보고합니다. 문서의 경고가 표시되는 것과 약간 비슷하지만 여전히 문제를 해결하는 방법이나 실제로 문제가 있는지 확실하지 않습니다.

  • 답변 # 1

    @EdChum이 지적한 바와 같이 여기 문서는 사전 순으로 정렬 된 것으로 표시됩니다.

    색인 (또는 열)이 정렬되어 있는지 확인하기 위해 is_lexsorted() 메소드가 있습니다.  그리고 속성 lexsort_depth  (어떤 이유로 문서 자체에서 실제로 찾을 수 없습니다).

    예 :

    임의의 순서로 시리즈 만들기

    In [1]:
    import pandas as pd
    arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
                ['one', 'two', '1', '3', 'one', 'two', 'one', 'two']]
    tuples = list(zip(*arrays))
    import random; random.shuffle(tuples)
    s = pd.Series(np.random.randn(8), index=pd.MultiIndex.from_tuples(tuples))
    s
    Out[1]:
    baz  3     -0.191653
    qux  two   -1.410311
    bar  one   -0.336475
    qux  one   -1.192908
    foo  two    0.486401
    baz  1      0.888314
    foo  one   -1.504816
    bar  two    0.917460
    dtype: float64
    
    

    is_lexsorted 및 lexsort_depth 확인 :

    In [2]: s.index.is_lexsorted()
    Out[2]: False
    In [3]: s.index.lexsort_depth
    Out[3]: 0
    
    

    색인을 정렬하고 값을 다시 확인하십시오 :

    In [4]: s = s.sortlevel(0, sort_remaining=True)
            s
    Out[4]:
    bar  one   -0.336475
         two    0.917460
    baz  1      0.888314
         3     -0.191653
    foo  one   -1.504816
         two    0.486401
    qux  one   -1.192908
         two   -1.410311
    dtype: float64
    In [5]: s.index.is_lexsorted()
    Out[5]: True
    In [6]: s.index.lexsort_depth  
    Out[6]: 2
    
    

  • 이전 php - 정규식으로 클래스/메소드 이름 확인
  • 다음 sh - xcodebuild가 터미널에서 빌드하지 못했지만 xcode에서 성공했습니다