2016-02-29 6 views
2

Учитывая DataFrame, ди,Выберите подмножество наблюдений из панд DataFrame с использованием списка меток

import pandas as pd 
import numpy as np 

data = { 
    "Event": ['Biathlon', 'Ski Jump', 'Slalom', 'Downhill'], 
    "Award": ['Gold', 'Bronze', 'Gold', 'Silver'], 
    "Points": ['100', '10', '100', '40'] 
} 
d = pd.DataFrame(data) 
di = d.set_index(["Award","Event"]) 

print(di) 
       Points 
Award Event   
Gold Biathlon 100 
Bronze Ski Jump  10 
Gold Slalom  100 
Silver Downhill  40 

Скажем, я хотел, чтобы выбрать все строки с наградой «Золото» в любом «Биатлон» или «Слалом» ... Почему это терпит неудачу?

di.loc[('Gold',['Biathlon','Slalom']),:] 

Основываясь на примере в pandas documentation, кажется, это должно работать. Я воспроизводил пример из документации ниже:

#example from http://pandas.pydata.org/pandas-docs/stable/advanced.html#using-slicers 

def mklbl(prefix,n): 
    return ["%s%s" % (prefix,i) for i in range(n)] 

miindex = pd.MultiIndex.from_product([mklbl('A',4), 
            mklbl('B',2), 
            mklbl('C',4), 
            mklbl('D',2)]) 

micolumns = pd.MultiIndex.from_tuples([('a','foo'),('a','bar'), 
               ('b','foo'),('b','bah')], 
               names=['lvl0', 'lvl1']) 

dfmi = pd.DataFrame(np.arange(len(miindex)*len(micolumns)).reshape((len(miindex),len(micolumns))), 
index=miindex, 
columns=micolumns).sort_index().sort_index(axis=1) 

dfmi.loc[(slice('A1','A3'),slice(None), ['C1','C3']),:] 

#this also works 
dfmi.loc[(['A1','A3'],['B0','B1'], ['C1','C3']),:] 
+1

FWIW, может быть проще просто сделать 'd [(d.Award == ' Gold ') & (d.Event.isin ([' Biathlon ',' Slalom ']))] ', если вам не нужно или хотите промахиваться с помощью мультииндекса, сортировки и т. Д. – JohnE

+0

Возможно, вы, вероятно, правильно. Я новичок в пандах (фон в R), и я просто пытаюсь познакомиться с индексационными особенностями панд. –

+0

Да, вы можете много работать с мультииндексами, но, как показывают эти Q & A, они одновременно мощные и (иногда) хитрые. Независимо от того, вы также захотите ознакомиться с простыми булевыми выборами. Но ничего плохого в том, как вы пытались это сделать. – JohnE

ответ

2

Вы должны сортировать индекс первого:

In [15]: 
data = { 
    "Event": ['Biathlon', 'Ski Jump', 'Slalom', 'Downhill'], 
    "Award": ['Gold', 'Bronze', 'Gold', 'Silver'], 
    "Points": ['100', '10', '100', '40'] 
} 
d = pd.DataFrame(data) 
di = d.set_index(["Award","Event"]) 
di = di.sort_index() 
di 

Out[15]: 
       Points 
Award Event   
Bronze Ski Jump  10 
Gold Biathlon 100 
     Slalom  100 
Silver Downhill  40 

In [16]:  
di.loc[('Gold',['Biathlon','Slalom']),:] 

Out[16]: 
       Points 
Award Event   
Gold Biathlon 100 
     Slalom  100 
+0

Спасибо, что указали это. Для других, которые достигают этой страницы, вот ссылка на документацию (0.17.1): http://pandas.pydata.org/pandas-docs/stable/advanced.html#the-need-for-sortedness-with-multiindex –

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