Tengo un DataFrame
de certaines transactions. Je veux regrouper ces transactions en fonction de leur item
y time
valeurs des colonnes : l'objectif est de regrouper les éléments qui sont à moins d'une heure les uns des autres. Nous commençons donc un nouveau groupe au moment de l'observation suivante qui n'était pas à moins d'une heure de l'observation précédente (Voir colonne start time
en DataFrame
B
).
Voici les données : Je veux convertir A
à B
.
A=
item time result
A 2016-04-18 13:08:25 Y
A 2016-04-18 13:57:05 N
A 2016-04-18 14:00:12 N
A 2016-04-18 23:45:50 Y
A 2016-04-20 16:53:48 Y
A 2016-04-20 17:11:47 N
B 2016-04-18 15:24:48 N
C 2016-04-23 13:20:44 N
C 2016-04-23 14:02:23 Y
B=
item start time end time Ys Ns total count
A 2016-04-18 13:08:25 2016-04-18 14:08:25 1 2 3
A 2016-04-18 23:45:50 2016-04-18 00:45:50 1 0 1
A 2016-04-20 16:53:48 2016-04-20 17:53:48 1 1 2
B 2016-04-18 15:24:48 2016-04-18 16:24:48 0 1 1
C 2016-04-23 13:20:44 2016-04-23 14:20:44 1 1 2
Voici ce que j'ai fait :
grouped = A.groupby('item')
A['end'] = (grouped['time'].transform(lambda grp: grp.min()+pd.Timedelta(hours=1)))
A2 = A.loc[(A['time'] <= A['end'])]
Cela me donne un groupe par jour : la transaction dans l'heure qui suit la première transaction. Je ne vois donc pas les autres transactions effectuées le même jour mais à plus d'une heure d'intervalle de la première. Mon problème est de savoir comment obtenir ces groupes. Je peux alors utiliser pd.crosstab
pour obtenir les détails que je veux de la result
colonne.
Une autre idée que j'ai eue est de trier A
por item
y time
et ensuite, rangée par rangée. Si l'heure se situe à moins d'une heure de la ligne précédente, elle est ajoutée à ce groupe, sinon, elle crée un nouveau groupe.