#python #pandas #dataframe #ranking #rank
Вопрос:
У меня есть фрейм данных, в котором я пытаюсь добавить новый столбец «рейтинг», чтобы определить рейтинг цен относительно столбцов «название» и «страна» путем сравнения цен (столбец «цена»). Если цена одного продукта одинакова, при использовании
df['rank'] = df.groupby('name')['price'].apply(lambda x: x.sort_values().rank())
Я получаю следующий результат -> столбец «ранг», но мне нужно получить тот, который выделен в «rank_2», и это не точно, потому что эти шесть продуктов имеют одинаковую цену и должны получить рейтинг 1. Как можно получить данный результат, как в столбце -> ‘rank_2’.
Помогите, пожалуйста, я буду благодарен
Комментарии:
1. Почему у Канады и Бразилии разные ценности?
Ответ №1:
вы должны выбрать метод ранжирования в функции ранжирования, например :
df['rank'] = df.groupby('name')['price'].apply(lambda x: x.sort_values().rank(method="dense"))
Комментарии:
1. Сортировка внутри лямбды не будет работать, так как это изменит индекс, а присвоение его столбцу ранга приведет
incompatible index
к ошибке
Ответ №2:
Если я правильно вас понял:
Вы можете использовать:
df['rank'] = df.sort_values(by=['name', 'price']).groupby(['name'])[['price']].apply(lambda x: x!= x.shift()).cumsum()
или
df['rank'] = df.sort_values(by=['name', 'price']).groupby('name')['price'].apply(lambda x: x.rank(method="dense"))
Вывод в обоих случаях:
name country price rank
0 S00123 mal 3.5 1.0
1 S00123 fra 3.5 1.0
2 S00123 spa 3.5 1.0
3 S00123 pur 3.5 1.0
4 S00123 rom 3.5 1.0
5 S00123 slo 3.5 1.0
6 S00123 jap 7.0 2.0
7 S00123 can 8.5 3.0
8 S00123 bra 8.5 3.0
9 S00123 ind 10.0 4.0
Комментарии:
1. Мухаммад Хасан — спасибо за ваш комментарий и объяснение, все работает!