Как выбрать значения столбцов по колонке?
Есть таблица с книгами:
| 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