У меня есть этот набор данных:

Id   query  count
001  abc    20
001  bcd    30
001  ccd   100
002  ace   13
002  ahhd   30
002  ahe    28

Я хочу найти запрос Top2 для каждого идентификатора на основе количества. Итак, я хочу увидеть:

Id   query  count
001  ccd    100
001  bcd    30
002  ahhd   30
002  ahe    28

Я попробовал эти две строки кода:

df.groupby('Id')['count'].nlargest(2), столбец «запрос» теряется в результате, а это не то, что я хотел. Так как сохранить запрос в моем результате. Количество

001     100
001     30
002     30
002     28
1
daydayup 31 Авг 2017 в 12:11

3 ответа

Лучший ответ

Используйте set_index пропавших без вести колонка ( ы):

df = df.set_index('query').groupby('Id')['count'].nlargest(2).reset_index()
print (df)
    Id query  count
0  001   ccd    100
1  001   bcd     30
2  002  ahhd     30
3  002   ahe     28
2
jezrael 31 Авг 2017 в 09:13

Вы можете сделать это с groupby еще:

df.sort_values('count', ascending = False).groupby('Id').head(2)
1
greg_data 31 Авг 2017 в 09:18

Я использую groupby и apply метод pd.DataFrame.nlargest. Это отличается от pd.Series.nlargest тем, что мне нужно указать набор столбцов, которые следует учитывать при выборе моих n строк. Это решение сохраняет исходные значения индекса, которые прикреплены к строкам, если это вообще важно для OP или конечного пользователя.

df.groupby('Id', group_keys=False).apply(
    pd.DataFrame.nlargest, n=2, columns='count')

   Id query  count
2   1   ccd    100
1   1   bcd     30
4   2  ahhd     30
5   2   ahe     28
2
piRSquared 31 Авг 2017 в 13:30