[python] 팬더 : 라벨별로 고유 한 멀티 인덱스 값 가져 오기



1 Answers

멀티 인덱스의 특정 수준 (및 수준 이름)의 고유 한 값을 원한다고 생각합니다. 나는 보통 다음과 같은 일을한다. 조금 길다.

In [11]: df.index.get_level_values('co').unique()
Out[11]: array(['DE', 'FR'], dtype=object)
Question

이 MultiIndex-ed DataFrame이 있다고 가정 해보십시오.

df = pd.DataFrame({'co':['DE','DE','FR','FR'],
                   'tp':['Lake','Forest','Lake','Forest'],
                   'area':[10,20,30,40],
                   'count':[7,5,2,3]})
df = df.set_index(['co','tp'])

다음과 같이 보입니다.

           area  count
co tp
DE Lake      10      7
   Forest    20      5
FR Lake      30      2
   Forest    40      3

인덱스 수준마다 고유 한 값검색하고 싶습니다. 이것은 다음을 사용하여 수행 할 수 있습니다.

df.index.levels[0]  # returns ['DE', 'FR]
df.index.levels[1]  # returns ['Lake', 'Forest']

제가 정말로하고 싶은 것은 레벨을 'co''tp' 이름붙여서 나열하는 것입니다. 내가 찾을 수있는 가장 짧은 두 가지 방법은 다음과 같습니다.

list(set(df.index.get_level_values('co')))  # returns ['DE', 'FR']
df.index.levels[df.index.names.index('co')]  # returns ['DE', 'FR']

그러나 그들 중 누구도 매우 우아합니다. 더 짧은 길이 있습니까?




레벨 조회를 반복적으로 수행하려는 경우 다음을 사용하여 색인 레벨 이름의 맵을 작성하여 고유 한 레벨을 레벨링 할 수 있습니다.

df_level_value_map = {
    name: level 
    for name, level in zip(df.index.names, df.index.levels)
}
df_level_value_map['']

그러나 한 번만이 조회를 수행하려는 경우이 방법은 원래의 시도보다 더 효율적 (또는 더 짧음)하지 않습니다.

그와 같은 사전 (또는 시리즈?)과 같은 이름을 가진 인덱스에 대한 메소드가 정말로 있었으면 좋겠습니다.

df.index.get_level_map(levels={...})

여기서 levels 매개 변수는 맵을 기존 레벨의 서브 세트로 제한 할 수 있습니다. 매개 변수가 없으면 다음과 같은 속성이 될 수 있습니다.

df.index.level_map





Related