2015-11-19 5 views
3

Я гугл и искал через стек, но не могу найти ответ на то, что, казалось бы этим простым вопрос:панда: вернуть первые N строки каждого вторичного индекса dataframe

Say У меня есть панды мультииндексированного dataframe следующим образом:

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

Вызов groupby на level=0 (в группе на первом уровне индекса) и вызвать 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

Это замечательный и элегантный ответ. Я пытался изо всех сил пытаться получить эту функциональность. Я пытался использовать '.groupby' с' .nth' безрезультатно. –

Смежные вопросы