Pandas — Удаление повторяющихся строк из фрейма данных на основе условия из серии путем сохранения приоритетных значений

#python #pandas

#python #pandas

Вопрос:

Допустим, у меня есть следующий фрейм данных:

 ID    Color
1     Red
2     Yellow
1     Green
3     Red
1     Green
2     Red
  

И давайте предположим, что приоритет цветов следующий:

 Green > Yellow > Red
  

Я хочу удалить строки с повторяющимися идентификаторами, сохранив ту, для которой цвет имеет наивысший приоритет. Итак, для этого примера я хотел бы получить этот результат:

 ID    Color
1     Green
2     Yellow
3     Red
  

Есть идеи, как я могу достичь этого с помощью функций pandas? Я провел много исследований в Интернете, включая документацию pandas, но не смог придумать хорошего подхода. Любая помощь была бы высоко оценена.

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

1. для вашего примера предположим, что ID равен индексу df.Color.sort_index().drop_duplicates(keep='last') , будет работать

Ответ №1:

Вы можете сделать это по крайней мере двумя способами, после того как вы установили свои цвета в категорию dtype с упорядочением.

 df['Color'] = pd.Categorical(df['Color'], categories=['Red','Yellow','Green'], ordered=True)
  

Вариант 1:

 df.sort_values('Color', ascending=False).drop_duplicates(['ID'])
  

Вывод:

    ID   Color
4   1   Green
1   2  Yellow
3   3     Red
  

Вариант 2:

 df.groupby('ID')['Color'].max()
  

Вывод:

 ID
1     Green
2    Yellow
3       Red
Name: Color, dtype: object
  

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

1. Есть другой способ изменить 🙂 кстати, все еще думаю, что Categorical это аккуратно 🙂

2. Большое спасибо за советы. Нужно попробовать и посмотреть, как это работает

Ответ №2:

Возможно, вам потребуется использовать map , создайте свой собственный порядок dict и drop_duplicates

 df.iloc[df.Color.map({'Red':0,'Yellow':1,'Green':2}).argsort()].drop_duplicates('ID',keep='last')
Out[607]: 
   ID   Color
3   3     Red
1   2  Yellow
4   1   Green