2013-06-10 11 views
7

Ho un dataframe come segue, dove ID è una stringa e la data è un datetime:Pandas aggregati/Gruppo per la maggior parte sulla base di data recente

Id Date 
1  3-1-2012 
1  4-8-2013 
2  1-17-2013 
2  5-4-2013 
2  10-30-2012 
3  1-3-2013 

mi piacerebbe consolidare la tabella per mostrare solo uno fila per ogni ID che ha la data più recente.
Qualche idea su come fare questo?

+0

La data rappresenta la data di invio, mi serve solo l'ultima inviata in quanto sostituisce le righe precedenti. – ChrisArmstrong

risposta

5

È possibile groupby campo Id:

In [11]: df 
Out[11]: 
    Id    Date 
0 1 2012-03-01 00:00:00 
1 1 2013-04-08 00:00:00 
2 2 2013-01-17 00:00:00 
3 2 2013-05-04 00:00:00 
4 2 2012-10-30 00:00:00 
5 3 2013-01-03 00:00:00 

In [12]: g = df.groupby('Id') 

Se non si è certi della ordinazione, si potrebbe fare qualcosa sulla falsariga:

In [13]: g.agg(lambda x: x.iloc[x.Date.argmax()]) 
Out[13]: 
        Date 
Id 
1 2013-04-08 00:00:00 
2 2013-05-04 00:00:00 
3 2013-01-03 00:00:00 

che per ogni gruppo afferra la riga con la data più recente (la più recente) (la parte argmax).

se si sapeva che erano in ordine si può prendere l'ultimo (o il primo) di entrata:

In [14]: g.last() 
Out[14]: 
        Date 
Id 
1 2013-04-08 00:00:00 
2 2012-10-30 00:00:00 
3 2013-01-03 00:00:00 

(Nota: non sono in ordine, quindi questo non funziona in questo caso!

0

Nella risposta Hayden, penso che l'utilizzo di x.loc al posto di x.iloc sia migliore, in quanto l'indice del datframe df potrebbe essere scarso (e in questo caso il iloc non funzionerà).

(Non ho abbastanza punti su StackOverflow per postarlo nei commenti della risposta).

Problemi correlati