Получить индекс фрейма данных на основе списка столбцов и значений

#python #python-3.x #pandas #dataframe

Вопрос:

Я пытаюсь вернуть индексы, в которых столбец имени — «Майк», Столбец состояния — «Рабочий» / «Сломан», столбец вероятности — «Высокий», а столбец состояния — «Открыт» / «Закрыт». Для этого примера индекс должен быть 1 и 2.

 import pandas as pd
df = pd.DataFrame(columns=['Name', 'State', 'Likelihood', 'Status']
df['Name'] = ['John', 'Mike', 'Mike', 'Jeff']
df['State'] = ['Operational', 'Operational', 'Broken', 'Operational' ]
df['Likelihood'] = ['High', 'High', 'Low', 'High']
df['Status'] = ['Open', 'Closed', 'Open', 'Closed']

print(df.index[df[['Name', 'State', 'Likelihood', 'Status']].isin(['Mike','Operational','Broken', 'High', 'Low' 'Open', ]).all(axis=1)])
 

В настоящее время не повезло с печатью индексов 1 и 2…В настоящее время печатается только 2

Комментарии:

1. Попробуйте ознакомиться с этой документацией по «логическому индексированию» .

Ответ №1:

Вы можете сделать это таким образом

 print(df[df.Name.isin(['Mike'])amp; (df.State.isin(['Operational','Broken'])| df.Likelihood.isin(['High','Low'])| df.Status.isin(['Open']))])
 

Выход

 Name        State Likelihood  Status
Mike  Operational       High  Closed
Mike       Broken        Low    Open
 

Ответ №2:

Один из способов сделать несколько логических масок в фрейме данных чистым способом-это:

 df[
   df['Name'].eq('Mike') amp;
   df['State'].isin(['Operational', 'Broken']) amp;
   df['Likelihood'].isin(['High', 'Low']) amp;
   df['Status'].isin(['Open', 'Closed'])
]
 

Выход:

     Name    State        Likelihood     Status
1   Mike    Operational     High        Closed
2   Mike    Broken          Low          Open
 

Если вам нужны индексы:

 df[
   df['Name'].eq('Mike') amp;
   df['State'].isin(['Operational', 'Broken']) amp;
   df['Likelihood'].isin(['High', 'Low']) amp;
   df['Status'].isin(['Open', 'Closed'])
].index.tolist()
 

Выход:

 [1, 2]