Как сгруппировать 4 столбца и ранжировать на основе другого столбца? - PullRequest
2 голосов
/ 01 июля 2019

У меня есть pandas dataframe df с источником, местом назначения и стоимостью, чтобы добраться от источника до места назначения.

SRCLAT SRCLONG DESTLAT DESTLONG PRICE
43.5   47.5    103.5   104      50                
43.5   47.5    103.5   104      100                  
43.5   47.5    103.5   104      100               
43.5   30      90      80       300                 
43.5   30      90      80       400
               90      80           

Я пытаюсь сделать ранжирование цен в процентилях, где верхний процентиль является самой низкой ценой для строк с одинаковыми координатами от источника до пункта назначения, игнорируя nans

Мой желаемый вывод:

SRCLAT SRCLONG DESTLAT DESTLONG PRICE  PERCENTILE
43.5   47.5    103.5   104      50       100% (best price out of 3)         
43.5   47.5    103.5   104      100      67% (tied for 2nd out of 3)            
43.5   47.5    103.5   104      100      67% (tied for 2nd out of 3)        
43.5   30      90      80       300      100% (best out of 2)          
43.5   30      90      80       400      50% (worst out of 2)
               90      80   

Как бы я это сделал?

Я пытался сгруппировать 4 столбца с помощью

df.groupby([SRCLAT, SRCLONG, DESTLAT, DESTLONG)].size()

чтобы получить размеры каждой уникальной группы, но я не знаю, куда идти.

1 Ответ

1 голос
/ 01 июля 2019

Использование rank с method='max'

c = ['SRCLAT', 'SRCLONG', 'DESTLAT', 'DESTLONG']
d = {'pct': True, 'ascending': False, 'method': 'max'}

df.assign(PERCENTILE=df.groupby(c)['PRICE'].rank(**d))

   SRCLAT  SRCLONG  DESTLAT  DESTLONG  PRICE  PERCENTILE
0    43.5     47.5    103.5       104     50    1.000000
1    43.5     47.5    103.5       104    100    0.666667
2    43.5     47.5    103.5       104    100    0.666667
3    43.5     30.0     90.0        80    300    1.000000
4    43.5     30.0     90.0        80    400    0.500000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...