2016-11-16 2 views
0

계층 적 색인과 함께 데이터를 사용하면 쉽게 값의 범위를 선택할 수 있습니까? xs.loc을 포함하여 내가 본 모든 방법은 단일 값으로 제한되는 것처럼 보입니다. Benefits of panda's multiindex?을 참조하십시오. 이 예제 데이터를 사용하여,다중 색인 (중복 값 포함)에서 선택

from pandas import * 
from numpy import * 
import itertools as it 

M = 100 # Number of rows to generate 

# Create some test data with multiindex 
df = DataFrame(randn(M, 10)) 
df.index = [randint(4, size=M), randint(8, size=M)] 
df.index.rename(['a', 'b']) 

나는 첫 번째 인덱스는 하나 또는 두 개의이고 두 번째 인덱스가 3 또는 4 내가 함께 .loc을 사용하고 왔어요 가장 가까운 곳 모두를 선택할 수 있도록하고 싶습니다 튜플

# Now extract a subset 
part = df.loc[[(1, 3), (1,4), (2,3), (2,4)]] 

그러나 이것은 몇 가지 이상한 행동을 제공 목록,

# The old indices are still shown for some reason 
print(part.index.levels) 

# Good indexing 
print("correct:\n", part.loc[(1, 1)]) 
# No keyerror, although the key wasn't included 
print("wrong:\n", part.loc[[(0, 3)]]) 
# Indexing of first index, and then a column, very odd 
print("odd:\n", part.loc[(1, 9)]) 
# But there is an error accessing the original this way 
print("Expected error:\n", df.loc[(1, 9)]) 

출력 :

In [436]: [[0, 1, 2, 3], [0, 1, 2, 3, 4, 5, 6, 7]] 
correct: 
      0   1   2   3   4   5   6 \ 
1 3 -0.183667 0.578867 -0.944514 0.026295 0.778354 0.603845 0.636486 
    3 -0.337596 0.018084 -0.654721 -1.121475 -0.561706 0.695095 -0.512936 
    3 -0.670779 -0.425093 1.262278 -1.806815 0.855900 -0.230683 -0.225658 
    3 -0.274808 -0.529901 1.265333 0.559646 -1.418687 0.492577 0.141648 

      7   8   9 
1 3 1.109179 -1.569236 -0.617408 
    3 -0.659310 1.249105 0.032657 
    3 0.315601 1.100192 -0.389736 
    3 -0.267462 -0.025189 0.069047 
odd: 
3 -0.617408 
3 0.032657 
3 -0.389736 
3 0.069047 
4 0.217577 
4 -0.232357 
Name: 9, dtype: float64 
wrong: 
     0 1 2 3 4 5 6 7 8 9 
0 3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
(truncated) 

계층 적 인덱스의 여러 부분에 액세스하는 튜플 목록보다 나은 방법이 있습니까? 그렇지 않은 경우 튜플을 사용하여 인덱싱 한 후 결과를 정리하여 NaN 대신 현명한 오류가 표시되도록 정리하는 방법이 있습니까?

답변

0

더 많은 사람이 읽을 수있는 slicings

In [52]: idx = pd.IndexSlice 

In [53]: dfmi.loc[idx[:,:,['C1','C3']],idx[:,'foo']] 
Out[53]: 
lvl0   a b 
lvl1   foo foo 
A0 B0 C1 D0 8 10 
     D1 12 14 
     C3 D0 24 26 
     D1 28 30 
    B1 C1 D0 40 42 
     D1 44 46 
     C3 D0 56 58 
...   ... ... 
A3 B0 C1 D1 204 206 
     C3 D0 216 218 
     D1 220 222 
    B1 C1 D0 232 234 
     D1 236 238 
     C3 D0 248 250 
     D1 252 254 

[32 rows x 2 columns] 

은 여기에서 볼을 가지고 pd.IndexSlice을 사용할 수 있습니다 http://pandas.pydata.org/pandas-docs/stable/advanced.html#using-slicers

+0

의 예와이 작품이 질문에 주어진 것 어떻게? – user2699

+0

'df.loc [IndexSlice [[0, 1], [3, 4]] : :]'작동해야하지만, 오류 'KeyError :'가 발생합니다. MultiIndex Slicing은 인덱스가 완전히 lexsorted tuple len이어야합니다 (2), lexsort 깊이 (0) ''. – user2699