Pandas Критерии выбора мультииндекса вместе с критериями выбора столбца - PullRequest
3 голосов
/ 28 мая 2020

Мне нужно запросить Pandas Dataframe на основе нескольких критериев в индексе и столбце. Пожалуйста, взгляните на мои данные ниже. «Страна» и «Фамилия» - это два отдельных индекса, а «Имя», «Оценка», «Тип» - столбцы.

y = pd.DataFrame({'Name':['Nikhil', 'Ankit', 'Keval', 'Darpan', 'Rajesh', 'John', 'Lynda'],
                  'Score':[89,92,96,82,95,98,97], 
                  'Type':['Fat','Slim','Fat','Slim','Fat','Slim','Slim'],
                  'Country':['India','USA','Denmark','Australia','Italy','China','Israel'],
                  'Surname':['Sharma','Sharma','Patel','Shah','Sharma','Sharma','Sharma']}                 
                ).set_index('Country').set_index('Surname', append=True)

enter image description here

Я хочу выбрать данные, которые соответствуют следующим критериям:

  • Страна не должна быть ни Индия, ни США
  • Фамилия должна быть Шарма
  • Оценка должна быть равна или выше 90
  • Тип должен быть Slim

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Для выбора в столбцах или на уровнях MultiIndex можно использовать query с цепочкой масок and или &:

q='Country not in ["India","USA"] and Surname == "Sharma" and Score >= 90 and Type == "Slim"'

Или:

q = 'Country not in ["India","USA"] & Surname == "Sharma" & Score >= 90 & Type == "Slim"'

print (y.query(q))
                  Name  Score  Type
Country Surname                    
China   Sharma    John     98  Slim
Israel  Sharma   Lynda     97  Slim

Альтернатива с boolean indexing, но объединение масок строго &:

m1 = ~y.index.get_level_values('Country').isin(["India","USA"])
m2 = y.index.get_level_values('Surname') == 'Sharma'
m3 = y['Score'].ge(90)
m4 = y['Type'].eq('Slim')
print (y[m1 & m2 & m3 & m4])
                  Name  Score  Type
Country Surname                    
China   Sharma    John     98  Slim
Israel  Sharma   Lynda     97  Slim
0 голосов
/ 28 мая 2020

Вы можете использовать этот код:

df.loc[(~df.index.isin(['India', 'USA'], level='Country'))& (df.index.get_level_values('Surname') == 'Sharma') & (df['Score'] >= 90) & (df['Type'] == 'Slim')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...