Как отобрать максимальные значения в группе строк?
Имею вот такой фрейм данных:
cid num bdate cost payed upto pdate
0 29 233128 2021-06-05 15000.0000 15000.0000 2021-06-06 2021-06-06
1 29 233128 2021-06-05 15000.0000 15000.0000 2021-06-08 2021-06-06
2 30 233126 2021-06-07 35000.0000 35000.0000 2021-06-09 2021-06-07
3 30 233127 2021-06-07 25000.0000 25000.0000 2021-06-07 2021-06-08
4 30 233127 2021-06-07 25000.0000 25000.0000 2021-06-08 2021-06-08
Нужно по каждому cid найти такой num, у которого pdate максимальный.
Как это сделать? При группировке остаются лишние.
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
если нужен только num:
In [86]: df.groupby("cid", group_keys=False).apply(lambda x: x.nlargest(1, "pdate")["num"])
Out[86]:
0 233128
3 233127
Name: num, dtype: int64
если нужны строки целиком:
In [87]: df.groupby("cid", group_keys=False).apply(lambda x: x.nlargest(1, "pdate"))
Out[87]:
cid num bdate cost payed upto pdate
0 29 233128 2021-06-05 15000.0 15000.0 2021-06-06 2021-06-06
3 30 233127 2021-06-07 25000.0 25000.0 2021-06-07 2021-06-08
Автор решения: strawdog
→ Ссылка
Если мне не изменяет память, groupby сохраняет порядок строк исходного фрейма в группе. Тогда можно сделать так:
df.sort_values("pdate").groupby("cid")["num"].last()
результат:
cid
29 233128
30 233127
Name: num, dtype: int64