python - manejo - Agrupe por marco de datos de pandas y seleccione lo último en cada grupo
seleccionar datos de un dataframe python (5)
Dado un marco de datos ordenado por fecha, puede obtener lo que solicita de varias maneras:
Me gusta esto:
df.groupby([''id'',''product'']).last()
Me gusta esto:
df.groupby([''id'',''product'']).nth(-1)
o así:
df.groupby([''id'',''product'']).max()
Si no desea que la
id
y el
product
aparezcan como índice, use
groupby([''id'', ''product''], as_index=False)
.
Alternativamente use:
df.groupby([''id'',''product'']).tail(1)
¿Cómo agrupar los valores del marco de datos de pandas y seleccionar el último (por fecha) de cada grupo?
Por ejemplo, dado un marco de datos ordenado por fecha:
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
agrupando por id o producto, y seleccionando los primeros da:
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
Para usar
.tail()
como método de agregación y mantener intacta su agrupación:
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
También puede usar
tail
con groupby para obtener los últimos n valores del grupo:
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
Tuve un problema similar y terminé usando
drop_duplicates
lugar de
groupby
.
Parece correr significativamente más rápido en grandes conjuntos de datos en comparación con otros métodos sugeridos anteriormente.
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
use
idxmax
en
groupby
y corte
df
con
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