2016-07-23 4 views
1

MultiIndex가있는 팬더 DataFrame이 있다고 가정합니다. 특정 값의 레이블이있는 모든 행을 가져 오려고합니다. 어떻게 할 수 있니?팬더 MultiIndex가 레이블 값이있는 모든 행을 얻습니다.

내 첫번째 생각은 ...

df[df.index.labels == 1].head()

부울 마스크했지만이 작동하지 않습니다.

감사합니다!

+0

인덱스를 다시 열로 변환 한 다음 필터링 할 수 있습니다. 확실히 하나의 색인으로 작동합니다. 그것은 multiindex와 함께 작동해야하지만 확실하지 않습니다. –

+2

작업중인 데이터 프레임을 보여줍니다. – Merlin

+0

왜 downvote? 이것은 분명히 어딘가에 문서화되어 있습니까? 불분명하니? 도움이되지 않습니까? 그것은 분명히 나를 도왔을거야 http://meta.stackoverflow.com/questions/252677/when-is-it-justifiable-to-downvote-a-question –

답변

2

사용할 색인을 지정해야합니다. 내 예제에서 나는 두 번째 인덱스가 (이 팬더의 Multiindex 페이지 그렇게 때문에 내 dataframe이 s의)에 나섭니다 :

s[s.index.labels[1]==1] 

입력 할 경우 실제로 인덱스를 구성하는 방법을 볼 수 있습니다

s.index 

그 결과 구조는 다음과 같습니다

>>> import pandas as pd 
>>> import numpy as np 
>>> arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], 
...   [1, 2, 1, 2, 1, 2, 1, 2]] 
... 
>>> tuples = list(zip(*arrays)) 
>>> index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) 
>>> s = pd.Series(np.random.randn(8), index=index) 
>>> s[s.index.labels[1]==1] 
first second 
bar 2  -0.304029 
baz 2  -1.216370 
foo 2   1.401905 
qux 2  -0.411468 
dtype: float64 
:

MultiIndex(levels=[['bar', 'baz', 'foo', 'qux'], [1, 2]], 
     labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]], 
     names=['first', 'second']) 

나는 전체 코드를 아래 6,

1

나는 xs (cross-section) 사용합니다 : (는 A 인덱스를 삭제하지 않고)

In [13]: df.xs(key=1, level="A") 
Out[13]: 
    C 
B 
2 3 

drop_level=False를 사용하여 필터를 수행합니다 :

In [11]: df = pd.DataFrame([[1, 2, 3], [3, 4, 5]], columns=list("ABC")).set_index(["A", "B"]) 

In [12]: df 
Out[12]: 
    C 
A B 
1 2 3 
3 4 5 

는 다음 1에 대한 동일한 수준이있는 사람들을 취할 수

In [14]: df.xs(key=1, level="A", drop_level=False) 
Out[14]: 
    C 
A B 
1 2 3 
0

대체 솔루션 :

In [62]: df = pd.DataFrame({'idx1': ['A','B','C'], 'idx2':[1,2,3], 'val': [30,10,20]}).set_index(['idx1','idx2']) 

In [63]: df 
Out[63]: 
      val 
idx1 idx2 
A 1  30 
B 2  10 
C 3  20 

In [64]: df[df.index.get_level_values('idx2') == 2] 
Out[64]: 
      val 
idx1 idx2 
B 2  10 

In [65]: df[df.index.get_level_values(1) == 2] 
Out[65]: 
      val 
idx1 idx2 
B 2  10