Как выбрать значения столбцов по колонке?

Есть таблица с книгами:

Author book_id q-ty_read
AuthorA 3915 5
AuthorA 7867 7
AuthorB 3756 17
AuthorC 8768 19
AuthorC 3112 27
AuthorC 523 101
AuthorD 54332 22
AuthorD 543 2

Задача - найти самую популярную книгу у автора по количеству прочитываний (q-ty_read).

Итог должен быть примерно в таком виде:

AuthorA|7867|7  
AuthorB|3756|17  
AuthorC|523|101  
AuthorD|54332|22  

Как это можно решить?


Ответы (2 шт):

Автор решения: strawdog

Возможно есть что-то поизящнее, но мне ночью в голову ничего лучше такого варианта не приходит:

res= df.groupby("Author", as_index=False).apply(lambda x: x.sort_values(by="q-ty_read", ascending=False).iloc[0])

res:

    Author  book_id  q-ty_read
0  AuthorA     7867          7
1  AuthorB     3756         17
2  AuthorC      523        101
3  AuthorD    54332         22

UPDATE

Вариант 2, без группировки вообще:

res = df.sort_values(["Author", "q-ty_read"], ascending=[True,False]).drop_duplicates(subset="Author", keep="first")

res, соответственно, так же:

    Author  book_id  q-ty_read
1  AuthorA     7867          7
2  AuthorB     3756         17
5  AuthorC      523        101
6  AuthorD    54332         22
→ Ссылка
Автор решения: MaxU

Воспользуйтесь DataFrame.groupby() и DataFrame.nlargest():

res = (df
       .groupby("Author", group_keys=False)
       .apply(lambda x: x.nlargest(1, "q-ty_read")))

результат:

In [7]: res
Out[7]:
    Author  book_id  q-ty_read
1  AuthorA     7867          7
2  AuthorB     3756         17
5  AuthorC      523        101
6  AuthorD    54332         22
→ Ссылка