Ответ 1
используйте idxmax
в groupby
и срез df
с помощью loc
df.loc[df.groupby('id').date.idxmax()]
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
Как группировать значения pandas данных и выбирать последние (по дате) из каждой группы?
Например, для данных, отсортированных по дате:
id product date
0 220 6647 2014-09-01
1 220 6647 2014-09-03
2 220 6647 2014-10-16
3 826 3380 2014-11-11
4 826 3380 2014-12-09
5 826 3380 2015-05-19
6 901 4555 2014-09-01
7 901 4555 2014-10-05
8 901 4555 2014-11-01
группировка по id или продукту, а выбор самого раннего дает:
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
используйте idxmax
в groupby
и срез df
с помощью loc
df.loc[df.groupby('id').date.idxmax()]
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
Вы также можете использовать tail
с groupby для получения последних n значений группы:
df.sort_values('date').groupby('id').tail(1)
id product date
2 220 6647 2014-10-16
8 901 4555 2014-11-01
5 826 3380 2015-05-19
Чтобы использовать .tail()
в качестве метода агрегирования и сохранить вашу группировку нетронутой:
df.sort_values('date').groupby('id').apply(lambda x: x.tail(1))
id product date
id
220 2 220 6647 2014-10-16
826 5 826 3380 2015-05-19
901 8 901 4555 2014-11-01
У меня была похожая проблема, и в итоге я использовал drop_duplicates
а не groupby
.
Кажется, он работает значительно быстрее на больших наборах данных по сравнению с другими методами, предложенными выше.
df.sort_values(by="date").drop_duplicates(subset=["id"], keep="last")
id product date
2 220 6647 2014-10-16
8 901 4555 2014-11-01
5 826 3380 2015-05-19