In primo luogo si vuole convertire la colonna della data per essere un datetime panda (piuttosto che le stringhe):
In [11]: pd.to_datetime(df['date'], format='%d%b%Y')
Out[11]:
0 2009-06-20
1 2009-06-24
2 2009-07-15
3 2008-02-09
4 2008-02-21
5 2010-03-14
6 2010-05-02
7 2010-05-12
Name: date, dtype: datetime64[ns]
Nota: vedi docs di possibili opzioni di formato.
In [12]: df['date'] = pd.to_datetime(df['date'], format='%d%b%Y')
In [13]: df
Out[13]:
patient date sequence
0 145 2009-06-20 1
1 145 2009-06-24 2
2 145 2009-07-15 3
3 582 2008-02-09 1
4 582 2008-02-21 2
5 987 2010-03-14 1
6 987 2010-05-02 2
7 987 2010-05-12 3
Se questo non è in ordine di data (per ogni paziente), che avrebbe risolto prima:
In [14]: df = df.sort('date')
Ora è possibile groupby e cumcount:
In [15]: g = df.groupby('patient')
In [16]: g.cumcount() + 1
Out[16]:
2 1
3 2
0 1
1 2
4 1
5 2
6 3
dtype: int64
Quale è quello che vuoi (anche se è fuori servizio):
In [17]: df['sequence'] = g.cumcount() + 1
In [18]: df
Out[18]:
patient date sequence
2 582 2008-02-09 1
3 582 2008-02-21 2
0 145 2009-06-24 1
1 145 2009-07-15 2
4 987 2010-03-14 1
5 987 2010-05-02 2
6 987 2010-05-12 3
Per riorganizzare (anche se si potrebbe non essere necessario) utilizzare sort_index
(o potremmo reindex se abbiamo salvato l'indice iniziale di dataframe): *
In [19]: df.sort_index()
Out[19]:
patient date sequence
0 145 2009-06-24 1
1 145 2009-07-15 2
2 582 2008-02-09 1
3 582 2008-02-21 2
4 987 2010-03-14 1
5 987 2010-05-02 2
6 987 2010-05-12 3
fonte
2015-04-02 04:55:31
è la risposta corretta :) –
Wow che un salvagente - che corre all'infinito più veloce di tutti i miei hack per questo – Owen