Панды -> Фрейм данных ->> рейтинг по цене

#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. Мухаммад Хасан — спасибо за ваш комментарий и объяснение, все работает!