J'ai eu du mal pendant un moment à essayer de classer un ensemble de données; peut-être que quelqu'un pourrait m'aider ou pointer dans la bonne direction.

J'ai un dataframe avec un tas d'événements qui se produisent les uns après les autres, et à un moment donné, un événement est enregistré dans l'une des colonnes. Cela ressemble à ceci:

       Timestamp         Event
0  10/26/2015 22:50:15     0
1  10/26/2015 22:50:46     0
2  10/26/2015 22:50:50     0
3  10/26/2015 22:50:51     0
4  10/26/2015 22:51:15     1
5  10/26/2015 22:51:47     0
6  10/26/2015 22:52:38     0
7  10/26/2015 22:54:46     1
8  10/26/2015 22:55:46     0

Je dois créer une nouvelle colonne qui identifie chaque groupe d'enregistrements qui se produisent jusqu'à chaque occurrence ou événement «1». Et définissez un compteur dans ce groupe. Le résultat devrait être quelque chose comme ceci:

       Timestamp         Event   Group
0  10/26/2015 22:50:15     0     1
1  10/26/2015 22:50:46     0     1
2  10/26/2015 22:50:50     0     1
3  10/26/2015 22:50:51     0     1
4  10/26/2015 22:51:15     1     1
5  10/26/2015 22:51:47     0     2
6  10/26/2015 22:52:38     0     2
7  10/26/2015 22:54:46     1     2

Veuillez noter que les enregistrements qui mènent maintenant à un événement «1» sont ignorés dans le résultat.

1
Geronimo 17 janv. 2017 à 01:48

2 réponses

Meilleure réponse

Vous pouvez utiliser cumsum() sur la colonne Event, qui donne un nouvel identifiant de groupe chaque fois que 1 est rencontré. Combiné avec shift(), vous pourrez créer la colonne Group comme prévu:

df['Group'] = df.Event.shift().cumsum().fillna(0) + 1

df.loc[df.index <= df.Event.iloc[::-1].idxmax()]   
# to filter trailing zero records 

enter image description here


Une autre option:

g = df.Event.iloc[::-1].cumsum()
df.loc[g != 0, 'Group'] = g.max() - g + 1
df.dropna()
3
Psidom 16 janv. 2017 à 23:20
df['Group'] = df.cumsum().drop_duplicates()
df['Group'] = df['Group'].fillna(method='bfill').astype(int)
df['Group'][0] = 1
0
DYZ 16 janv. 2017 à 23:00