Группы pandas и выберите последний в каждой группе

Как группировать значения 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

Ответ 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

Ответ 2

Вы также можете использовать 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

Ответ 3

Чтобы использовать .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

Ответ 4

У меня была похожая проблема, и в итоге я использовал 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