2017-12-06 5 views
2

내가 (여기 예제 관련 :) 다음과 같은 팬더가 나는 두 multiindex 여기에 슬라이스 경우팬더 다중 인덱스 조각

import numpy as np 
import pandas as pd 

variable = np.repeat(['a','b','c'], [5,5,5]) 
time = [0,1,5,10,20,0,1,5,10,20,0,1,5,10,20] 

arra = [variable, time] 

index=pd.MultiIndex.from_arrays(arra, names=("variable", "time")) 

s = pd.Series(
    np.random.randn(len(sequence)), 
    index=index 
) 

출력

# In [1]: s 
variable time 
a   0  -1.284692 
      1  -0.313895 
      5  -0.980222 
      10  -1.452306 
      20  -0.423921 
b   0  0.248625 
      1  0.183721 
      5  -0.733377 
      10  1.562653 
      20  -1.092559 
c   0  0.061172 
      1  0.133960 
      5  0.765271 
      10  -0.648834 
      20  0.147158 
dtype: float64 

# In [2]: s.loc[("a",0),:] 
variable time 
a   0  1.583589 
      1  -1.081401 
      5  -0.497904 
      10  0.352880 
      20  -0.179062 
dtype: float64 

하지만 보조 인덱스 인 "tim e "로 표시한다. 시간 = 0 및 첫 번째 인덱스와 모든 행을 얻을? 다음은 작동하지 않습니다.

# In [3]: s.loc[(0),:] 

KeyError: 0 

어떻게하면됩니까?

답변

3

선택에 대한 :와 두 번째 수준 또는 loc을 지정에 사용 xs 모든 첫 번째 수준의 값과 두 번째 수준의 선택 값에 대한 0 :

print (s.xs(0, level=1)) 

또는 :

print (s.loc[:, 0]) 


a 0.376784 
b -0.643836 
c -0.440340 
dtype: float64 

인덱스 작업하는 경우 데이터 프레임의 열과 열은 slicers :

idx = pd.IndexSlice 
df = pd.concat([s,s * 10], axis=1, keys=['a','b']) 
print (df) 
         a   b 
variable time      
a  0  1.054582 10.545820 
     1 -1.716213 -17.162130 
     5 -0.187765 -1.877645 
     10 -0.419005 -4.190047 
     20 -0.772808 -7.728078 
b  0 -0.022520 -0.225202 
     1 -0.638453 -6.384531 
     5  0.410156 4.101559 
     10 0.512189 5.121889 
     20 -1.241232 -12.412322 
c  0 -0.134815 -1.348148 
     1 -1.007632 -10.076318 
     5 -0.859790 -8.597898 
     10 -0.623177 -6.231767 
     20 -0.635504 -6.355036 

print (df.loc[idx[:, 0], 'a']) 
variable time 
a   0  1.054582 
b   0  -0.022520 
c   0  -0.134815 
Name: a, dtype: float64 
+0

우수. ".xs"는 현재 작동하지만 현재 실제 데이터 프레임으로 솔루션을 시도하고 있지만 "a"대신 모든 열을 선택/유지하려고합니다. 쉼표 만 남기면 " UnsortedIndexError : 'MultiIndex Slicing은 인덱스가 완전히 lexsorted tuple이어야합니다. len (2), lexsort depth (1)'" – Rockbar

+0

네, 먼저 df = df.sort_index()가 필요합니다. – jezrael

+0

문서에서 [여기] (http://pandas.pydata.org/pandas-docs/stable/advanced.html#sorting-a-multiindex) – jezrael

1

jezrael가 제안한 답변은 훌륭하고 효과적입니다. 대체 방법으로 swaplevel()을 다음과 같이 사용할 수 있습니다.

print(s.swaplevel().loc[0, :]) 

variable 
a 1.534837 
b 1.311133 
c 0.215539 
dtype: float64