2017-10-07 5 views
3

나는 이런 multiindex의 dataframe 있습니다분리 된 데이터 프레임의 원본 색인 요소가 모두 표시되는 이유는 무엇입니까?

import pandas as pd 
import numpy as np 


df = pd.DataFrame({'ind1': list('aaaaaaaaabbbbbbbbb'), 
        'ind2': list('cccdddeeecccdddeee'), 
        'ind3': list(range(3))*6, 
        'val1': list(range(100, 118)), 
        'val2': list(range(70, 88))}) 

df_mult = df.set_index(['ind1', 'ind2', 'ind3']) 

       val1 val2 
ind1 ind2 ind3    
a c 0  100 70 
      1  101 71 
      2  102 72 
    d 0  103 73 
      1  104 74 
      2  105 75 
    e 0  106 76 
      1  107 77 
      2  108 78 
b c 0  109 79 
      1  110 80 
      2  111 81 
    d 0  112 82 
      1  113 83 
      2  114 84 
    e 0  115 85 
      1  116 86 
      2  117 87 

지금 제공이

df_subs = df_mult.loc[pd.IndexSlice['a', ['c', 'd'], :], :] 

같은 .loc를 사용하여의 하위 집합을 선택할 수 있습니다 예상

   val1 val2 
ind1 ind2 ind3    
a c 0  100 70 
      1  101 71 
      2  102 72 
    d 0  103 73 
      1  104 74 
      2  105 75 

I 인쇄

df_subs.index 
,451,515,

나는

MultiIndex(levels=[[u'a', u'b'], [u'c', u'd', u'e'], [0, 1, 2]], 
      labels=[[0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]], 
      names=[u'ind1', u'ind2', u'ind3']) 

왜 아직 레벨 0에서 b뿐 아니라 a가있는거야?

인덱스의 요소를 다른 용도로 사용하려면 문제가 될 수 있습니다. 그런 다음

df_subs.index.levels[0] 

나에게 그러나

Index([u'a', u'b'], dtype='object', name=u'ind1') 

,

df_subs.index.get_level_values('ind1').unique() 

나에게 나에게 일관성 보이는

Index([u'a'], dtype='object', name=u'ind1') 

을 제공을 제공합니다.

이 버그 또는 의도 된 동작입니까?

+1

에서

내가 – Wen

답변

3

이 문제를 해결하는 GitHub에 대한 토론이 있습니다. here.

간단히 말해서, 실제로 관찰 한 MultiIndex의 값으로 볼 수있는 레벨은 계산되지 않습니다. 관찰하지 못한 레벨은 처음에 MultiIndex를 설정 한 후에도 색인화를 통해 유지됩니다. 이렇게하면 모든 뷰와 모든 MultiIndex의 복사본간에 수준 인덱스를 공유 할 수 있습니다. 이는 메모리 단위로 훌륭합니다. 즉 df_multdf_subs은 메모리의 동일한 기본 수준 인덱스를 공유합니다.

레벨을 재 계산하여 사용되지 않는 레벨을 다시 계산하고 새 MultiIndex를 만들려는 경우 MultiIndex.remove_unused_levels()을 사용할 수 있습니다. 귀하의 경우

>>> df_subs.index.remove_unused_levels().levels[0] 
Index(['a'], dtype='object', name='ind1') 
+1

이 주 독자 않는 이유도 :) 알고 싶어'MultiIndex.remove_unused_levels을()'팬더 버전 20에서 시작하는 * 새 * 방법입니다. – Parfait