Wie gruppiere ich die Werte des Pandas-Datenrahmens und wähle aus jeder Gruppe die neuesten (nach Datum) aus?
Beispiel: Ein Datenrahmen ist nach Datum sortiert:
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
Gruppierung nach ID oder Produkt und Auswahl der frühesten ergibt:
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
python
pandas
group-by
pandas-groupby
DevEx
quelle
quelle
Sie können auch
tail
mit groupby verwenden, um die letzten n Werte der Gruppe abzurufen: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
quelle
groupby
die Ordnung bewahrt?Ich hatte ein ähnliches Problem und benutzte es
drop_duplicates
eher alsgroupby
.Es scheint bei großen Datenmengen im Vergleich zu anderen oben vorgeschlagenen Methoden signifikant schneller zu laufen.
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
quelle
Bei einem nach Datum sortierten Datenrahmen können Sie auf verschiedene Arten das erhalten, wonach Sie fragen:
So was:
df.groupby(['id','product']).last()
so was:
df.groupby(['id','product']).nth(-1)
oder so:
df.groupby(['id','product']).max()
Wenn Sie nicht möchten
id
undproduct
als Index angezeigt werden sollen, verwenden Siegroupby(['id', 'product'], as_index=False)
. Alternativ verwenden Sie:df.groupby(['id','product']).tail(1)
quelle
So verwenden Sie es
.tail()
als Aggregationsmethode und behalten Ihre Gruppierung bei: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
quelle