2015-11-19 134 views
3

的每個二級指標的前N行我一派,並通過堆棧搜查,但找不到答案了什麼似乎是這個簡單的問題:大熊貓:返回數據幀

說我有一個熊貓多索引的數據幀如下:

Foo 0 0.021362 
    1 0.917947 
    2 -0.956313 
    3 0.834556 
    4 -0.387533 
Bar 0 -0.242659 
    1 0.398657 
    2 0.455909 
    3 0.200061 
    4 -1.273537 
Baz 0 0.747849 
    1 -0.012899 
    2 1.026659 
    3 -0.256648 
    4 0.799381 

如何限制輸出到只有第N個每個第二級索引的行如下(如果N是2):

Foo 0 0.021362 
    1 0.917947 
Bar 0 -0.242659 
    1 0.398657 
Baz 0 0.747849 
    1 -0.012899 

在ILOC所有嘗試,升oc,slice,sliceindex和ix至今都失敗了。如果已經發布,請幫助並道歉。

回答

8

level=0呼叫groupby(以小組第一指數水平),並調用head(2)拿到第2排的每個組:

In [13]: 
df.groupby(level=0).head(2) 

Out[13]: 
        val 
index1 index2   
Foo 0  0.021362 
     1  0.917947 
Bar 0  -0.242659 
     1  0.398657 
Baz 0  0.747849 
     1  -0.012899 

它可以使用loc切片但指數需要是sorted first

In [25]: 
idx = pd.IndexSlice 
df.sort_index().loc[idx[:,0:1],:] 

Out[25]: 
        val 
index1 index2   
Bar 0  -0.242659 
     1  0.398657 
Baz 0  0.747849 
     1  -0.012899 
Foo 0  0.021362 
     1  0.917947 

,而不調用sort_index它會提出一個KeyError

KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (0)'

+0

這是一個了不起的,優雅的答案。我一直在掙扎2天試圖獲得這個功能。我試圖用'.groupby'和'.nth'來無濟於事。 –