Probeneingang:Wie pandas groupby mit Aggregation zum Zählen der Gesamtzeit eines bestimmten Ereignisses für eine bestimmte ID verwenden?
ID Timestamp Event
1 1 2010-05-31 13:43:45 a
2 1 2010-05-31 13:44:25 a
3 1 2010-05-31 13:44:55 a
4 1 2010-05-31 13:45:35 b
5 1 2010-05-31 13:47:05 b
6 1 2010-05-31 13:47:45 a
7 1 2010-05-31 13:49:45 c
8 1 2010-05-31 13:50:45 b
9 1 2010-06-01 09:20:00 c
10 1 2010-06-01 09:22:00 c
11 1 2010-06-01 09:23:20 c
12 1 2010-06-01 09:24:00 a
13 1 2010-06-01 09:24:15 a
14 1 2010-06-01 09:25:00 b
15 1 2010-06-01 09:25:42 b
16 2 2010-05-31 11:25:38 a
17 2 2010-05-31 11:26:00 c
18 2 2010-05-31 11:26:45 a
19 2 2010-05-31 11:27:10 a
20 2 2010-05-31 11:27:37 a
21 2 2010-05-31 11:29:35 b
22 2 2010-05-31 11:30:25 b
. . . .
. . . .
. . . .
Dies ist ein Pseudo-Code von dem, was ich gerade tue, aber es ist nicht richtig
# Right now I'm looping through the dataframe, using this pseudocode:
for row in df.itertuples():
check for ID match: (say, 1 == 1)
check for event match: (say a == a)
calculate time duration,
check for < 3600
store in a dictionary of the events ('a', 'b',etc = keys), cumulative
store this events dictionary for the ID
else Increment session accordingly
else
store the previous occurrence time of the previous event,
use it for the next occurrence of the event, using a dictionary;
At the same time, find the current event's duration w.r.t.
the time stored at the previous changing of the event(in the above line),
again check for < 3600
store in a dictionary of the events ('a', 'b',etc = keys), cumulative
store this events dictionary for the ID
else Increment session accordingly
else
reset events dictionary to zero values
reset the event change dictionary to zero values
Dies ist ein Beispiel für die Ausgabe, aber ähnlich zu arbeiten, was ich tun will .
ID a_time b_time c_time Session
1 1 120 200 100 2
2 2 235 340 145 3
. . . . . .
. . . . . .
Actually there are 7 unique events in all, I've just mentioned 3
to keep it less complicated.
{Grundsätzlich „a_time“ = Summe der von allen genommen OCCURENCES das Ereignis ‚a‘ für die aktuelle ID (wenn die Zeitdauer für das Auftreten nicht größer als 3600s, sonst die Sitzungsanzahl entsprechend erhöhen Sitzung + Zeitdauer/3600 oder durch plus 1 nur dann, wenn sich das Datum ändert auch)
‚‘ = ähnlichen Eintrag}
Hoffnung: gibt es eine pythonic oder ein vektorisiert Weg um dies zu tun? Wie verwendet, um
df.groupby(['ID'])['Timestamp'].diff()
ich viele Versionen von diesem, aber es hat nicht funktioniert für mich, da ich „keine Aggregationsfunktion für pd.groupby“
Wenn ich didn‘bekommen t müssen die Zeitprotokolle verwenden, dann würde ich nur den
df.groupby(['ID'])['Event'].value_counts().unstack().fillna(0)
Befehl verwenden, um eine Ausgabe zu erhalten, die die Zählung jedes der einzigartigen Veranstaltungen für jeden ID sein würde.
Mein erhielt Ausgang, den Pseudo-Code Ansatz zur Verwendung ist nur die Wiederholung der ersten Zeile (nur einige Zufallszahlen hier gezeigt, nicht berechnet), unten gezeigt, und ich bin nicht in der Lage alle zu sehen Veranstaltungen finden als gut, nur drei.
ID a_time b_time c_time
1 1 120 200 100
mit groupby mit [ ‚Timestamp‘] diff(), wie in dem oben erwähnten Teil gibt mir „für pd.groupby keine Aggregationsfunktion verfügbar“ Fehler. Ich habe sogar sort_values verwendet, aber ich habe immer diese gleichen Fehler (nur in der obigen Zeile erwähnt).
Ich habe es nur getan, danke, dass Sie mich wissen lassen! – Darknorth