2017-12-04 1 views
0

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).

+0

Ich habe es nur getan, danke, dass Sie mich wissen lassen! – Darknorth

Antwort

0

Ich löste es selbst. Ich fand heraus, dass ich nur diese verwenden:

df.at[index, col] = df.at[index, col] + duration 

Grundsätzlich als Datenrahmen als Matrix visualisiert kann, daher kann ich noch einen Datenrahmen zugreifen, indem es Zelle ist, so habe ich es geschafft, es zu lösen.

Verwandte Themen