2016-08-22 10 views
2

둘 이상의 열에 대해 get_level_values의 결과를 얻는 방법이 있습니까?여러 열에 대한 팬더 get_level_values ​​

주어진 DataFrame 다음

[(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 

참고 :

  d 
a b c  
1 4 10 16 
    11 17 
    5 12 18 
2 5 13 19 
    6 14 20 
3 7 15 21 

나는 수준 ac의 값 (튜플 목록)을 얻을하고자하는

  • get_level_values 하나 이상의 레벨 ()을 지정하는 것은 불가능합니다. 예를 들어

:

a_list = df.index.get_level_values('a').values 
c_list = df.index.get_level_values('c').values 

print([i for i in zip(a_list,c_list)]) 
[(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 

하지만이 숫자로 성가신 일이 원하는 각 컬럼을 통해 get_level_values를 사용하고 zip을 함께 할 수있는 해결 방법이있다df.index.get_level_values(['a','c'])

  • 증가합니다.

    • DataFrame를 구축 할 수있는 코드 : 당신은 당신이 선택하려는 인덱스 이름의 목록을 통과 할 수

    df = pd.DataFrame({'a':[1,1,1,2,2,3],'b':[4,4,5,5,6,7,],'c':[10,11,12,13,14,15], 'd':[16,17,18,19,20,21]}).set_index(['a','b','c'])

  • 답변

    3

    MultiIndex.tolist() 방법은 MultiIndex의 모든 수준에 대한 튜플의 목록을 제공합니다.

    1. 원래 MultiIndex에서 튜플의리스트를 취득하고 결과를 필터링 : 예를 들어, 예를 DataFrame

      df.index.tolist() 
      # => [(1, 4, 10), (1, 4, 11), (1, 5, 12), (2, 5, 13), (2, 6, 14), (3, 7, 15)] 
      

      그래서 여기에 두 가지 아이디어입니다.

      [(a, c) for a, b, c in df.index.tolist()] 
      # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 
      

      이 간단한 방법의 단점은 원하는 수준의 순서를 수동으로 지정해야한다는 것입니다. itertools.compress을 사용하여 이름으로 대신 선택할 수 있습니다.

      from itertools import compress 
      
      mask = [1 if name in ['a', 'c'] else 0 for name in df.index.names] 
      [tuple(compress(t, mask)) for t in df.index.tolist()] 
      # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 
      
    2. 정확히 당신이 원하는 수준이있는 MultiIndex을 만들고 그 위에 .tolist()를 호출합니다.

      df.index.droplevel('b').tolist() 
      # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 
      

      당신이 —를 삭제하는 대신 당신이 원하는 그 사람들의 —을 유지하려는 레벨 이름을 선호하는 경우에 당신은에 droplevel``의 무언가와 같은

      df.index.droplevel([level for level in df.index.names 
             if not level in ['a', 'c']]).tolist() 
      # => [(1, 10), (1, 11), (1, 12), (2, 13), (2, 14), (3, 15)] 
      
    +0

    니스 사용을 할 수 마지막 경우 :) – IanS

    0

    이는 한, 덜 복잡 :

    df.reset_index()[['a', 'c']].to_dict(orient='split')['data'] 
    

    색인에서 수준을 선택하는 방법을 찾지 못했습니다 'a''b' 객체이므로 직접 reset_index을 사용하십시오.

    to_dict이 리턴리스트의 목록이 아니라 튜플 :

    [[1, 10], [1, 11], [1, 12], [2, 13], [2, 14], [3, 15]] 
    
    관련 문제