web-dev-qa-db-fra.com

regrouper par pandas dataframe et sélectionner le dernier dans chaque groupe

Comment regrouper les valeurs de pandas dataframe et sélectionner la dernière (par date) de chaque groupe?

Par exemple, étant donné une trame de données triée par date:

    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

le regroupement par identifiant ou produit, et la sélection de la première donne:

    id     product   date
2   220    6647     2014-10-16
5   826    3380     2015-05-19
8   901    4555     2014-11-01
36
DevEx

utilisez idxmax dans groupby et découpez df avec 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
30
piRSquared

Vous pouvez également utiliser tail avec groupby pour obtenir les n dernières valeurs du groupe:

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
41
ade1e

Étant donné une trame de données triée par date, vous pouvez obtenir ce que vous demandez de plusieurs façons:

Comme ça:

df.groupby(['id','product']).last()

comme ça:

df.groupby(['id','product']).nth(-1)

ou comme ça:

df.groupby(['id','product']).max()

Si vous ne voulez pas que id et product apparaissent comme index, utilisez groupby(['id', 'product'], as_index=False). Vous pouvez également utiliser:

df.groupby(['id','product']).tail(1)
2
Sandu Ursu

Pour utiliser .tail() comme méthode d'agrégation et conserver votre regroupement intact:

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
1
Kristin Q

J'ai eu un problème similaire et j'ai fini par utiliser drop_duplicates plutôt que groupby.

Il semble fonctionner beaucoup plus rapidement sur de grands ensembles de données par rapport aux autres méthodes suggérées ci-dessus.

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
1
Damien Marlier