2017-03-08 8 views
3

ich Pandas Datenrahmen haben, die Datumsangaben im Format enthält: yyyy-mm-dd:Sortieren Daten mit groupby Pandas

id1 = ['2015-09-23', '2014-07-08', '2015-07-30', '2008-09-26', 
     '2009-07-13', '2009-09-28', '2014-04-10', '2009-06-03'] 

id2 = ['2011-04-15', '2015-11-30', '2015-06-15', '2015-12-01', 
     '2015-12-23', '2009-01-14', '2009-06-17', '2009-08-07'] 

id3 = ['2010-01-26', '2010-03-16', '2011-11-23', '2012-01-31', 
     '2012-06-08', '2012-10-26', '2013-01-07', '2013-11-12'] 

df = pd.DataFrame({'dates':id1 + id2 + id3,'id':['id1']*8+['id2']*8+['id3']*8}) 

enter image description here

Daraus möchte ich das erste und das letzte Datum erhalten für jede ID.

Ich habe versucht, die folgenden:

df.groupby(['id'])['dates'].agg({'sort':sorted}) 

enter image description here

Das Problem mit diesem ist, dass ich nur in der Lage bin das erste Datum nicht das letzte Mal zu sehen. Ich möchte eine Liste mit nur zwei Elementen ausgeben: erstes und letztes Datum. Anstatt der ganzen Liste.

Antwort

6

leicht peasy

df.groupby('id').dates.agg({'date ': ['first', 'last']}) 
+0

Interessant, aber es scheint, es ist t Ändern der Reihenfolge der Elemente in der Liste statt nach Datum sortieren. Ich möchte mit wissen, sind die früheren und letzten Termine –

+0

dann ersetzen zuerst und zuletzt von min und max. du kannst meine lösung dann annehmen haha ​​ –

+0

Wo sind diese ersten, letzten Funktionen definiert? Pandas? –

2

Versuchen:

df.groupby(['id']).apply(lambda x: [sorted(x['dates'])[0], 
            sorted(x['dates'])[-1]]) 

Dies erfordert zweimal Sortierung, so dass Sie das Lambda als Hilfsfunktion definieren möchten.

2

Sie können die erste eingebaute verwenden und letzte

df.groupby(['id'])['dates'].agg(['first', 'last']) 

Dass Sie

first  last 
id  
id1 2015-09-23 2009-06-03 
id2 2011-04-15 2009-08-07 
id3 2010-01-26 2013-11-12 
+1

Willst du mich verarschen? Das ist meine Lösung –

2

ich abgeholt gibt, wo Sie links, und hier ist Ihre Lösung mit nur zwei Linien und Liste Verständnis:

>>> new_df = df.groupby(['id'])['dates'].agg({'sort':sorted}) 
>>> new_df 
                sort 
id 
id1 [2008-09-26, 2009-06-03, 2009-07-13, 2009-09-2... 
id2 [2009-01-14, 2009-06-17, 2009-08-07, 2011-04-1... 
id3 [2010-01-26, 2010-03-16, 2011-11-23, 2012-01-3... 
>>> new_df['sort'] = [[lst[0], lst[-1]] for lst in new_df['sort'].tolist()] 
>>> new_df 
         sort 
id 
id1 [2008-09-26, 2015-09-23] 
id2 [2009-01-14, 2015-12-23] 
id3 [2010-01-26, 2013-11-12] 
>>> 
3
In[8]: df.groupby(['id']).dates.apply(lambda x: [min(x),max(x)]) 
Out[8]: 
id 
id1 [2008-09-26, 2015-09-23] 
id2 [2009-01-14, 2015-12-23] 
id3 [2010-01-26, 2013-11-12]