Учитывая 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']),:]
FWIW, может быть проще просто сделать 'd [(d.Award == ' Gold ') & (d.Event.isin ([' Biathlon ',' Slalom ']))] ', если вам не нужно или хотите промахиваться с помощью мультииндекса, сортировки и т. Д. – JohnE
Возможно, вы, вероятно, правильно. Я новичок в пандах (фон в R), и я просто пытаюсь познакомиться с индексационными особенностями панд. –
Да, вы можете много работать с мультииндексами, но, как показывают эти Q & A, они одновременно мощные и (иногда) хитрые. Независимо от того, вы также захотите ознакомиться с простыми булевыми выборами. Но ничего плохого в том, как вы пытались это сделать. – JohnE