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
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
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
É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)
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
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