2017-12-06 5 views
2

私は(ここでは一例に関連:)以下のパンダを持って、私は両方のマルチインデックスにここにスライスした場合パンダマルチインデックス・スライスが

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例えば、時間= 0と最初のインデックスですべての行を得る?以下は動作しません:

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

KeyError: 0 

私はここでそれをどうしますか?

答えて

3

選択用:を有する第2レベルまたはlocを指定で使用xs全ての第1のレベルの値と第二のレベルの値を選択するための0

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

または:

print (s.loc[:, 0]) 


a 0.376784 
b -0.643836 
c -0.440340 
dtype: float64 

インデックスを扱う場合DataFrameの列を使用してください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: 'マルチインデックススライスではインデックスが完全にlexsortされている必要があります。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 
関連する問題