2016-06-06 1 views
2
srch_destination  hotel_booked  count 
28     1     4 
28     5     1 
28     8     2 
28     11     9 
28     14     17 
19     11     3 
19     2     5 
19     5     8 
19     6     10 

Предположим, у меня есть формат данных, отформатированный выше. Это поиски, так что предположим, что 4 человека, которые искали 28 мест для бронирования. 1. Я по сути хочу получить фреймворк данных, содержащий строку для каждого пункта назначения, а также соответствующие 3 бронирования. Так что для этого dataframe, мы имели бы две строки, которые выглядят как:Эффективная сортировка и агрегирование данных в Python?

srch_destination top_hotels 
28     14 11 1 
19     6 5 2 

В настоящее время мой код ниже, где «c_id» является начальным dataframe и «а» желаемого результата. Я родом из R, и мне интересно, есть ли более эффективный способ сделать эту сортировку и последующую агрегацию.

import numpy as np 
import pandas as pd 

a = pd.DataFrame() 

for ind in np.unique(c_id.srch_destination): 
    nlarg = c_id[c_id.srch_destination == ind].sort_values('count', ascending = False).head(3)['hotel_booked']  
    a = a.append({'srch_destination': ind, 'top_hotels': " ".join(map(str, nlarg))}, ignore_index=True) 

a.to_csv('out.csv') 
+0

Удалено из моего ответа R ... извините .. Я пропустил этот пункт. Ошибочно, хотя вы хотели, чтобы python перенесен на R. – Gopala

ответ

3

Используйте nlargest, чтобы получить верхнюю 3 на основе count колонке.

>>> (df.groupby('srch_destination') 
     .apply(lambda group: group.nlargest(3, 'count').hotel_booked.tolist())) 
srch_destination 
19  [6, 5, 2] 
28 [14, 11, 1] 
dtype: object 
Смежные вопросы