панды проверяют условия внутри подмножества, чтобы получить значения

#python #pandas

Вопрос:

Следующий набор данных содержит контейнеры с конкретными элементами, имеющими определенный приоритет.

 container item_No  Priority
1          123      A
1          124      B
1          142      D
2          516      C
2          142      D
3          516      C
3          124      B
3          123      A
 

Я хотел бы иметь набор данных, в котором, если в контейнере есть какие-либо элементы с приоритетом «А», то уровень приоритета для всего контейнера равен «А». Если A нет, проверьте наличие B, а затем установите уровень приоритета «B». Если «B» нет, проверьте «C». и так далее, и тому подобное…

Я хотел бы получить следующий df в качестве вывода.

 container  Priority
1            A
2            C
3            A
 

Ответ №1:

Сначала преобразуйте столбец для упорядоченных категорий с указанием порядка, а затем агрегируйте min :

 df['Priority'] = pd.Categorical(df['Priority'], ordered=True, categories=['A','B','C','D'])

df = df.groupby('container', as_index=False)['Priority'].min()
print (df)
   container Priority
0          1        A
1          2        C
2          3        A
 

Если работать с буквами, как ABCD в порядке по умолчанию, решение проще:

 df = df.groupby('container', as_index=False)['Priority'].min()
 

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

1. Это приятно знать, я только что придумал A B C D, например, метки приоритетов на самом деле arbritary.