2016-08-02 26 views
0

Ich habe einen Datenrahmen wie folgt aus:Erfassung der Reihenfolge des Auftretens einer ID in Datenrahmen mit Python

ID    Product 
10001    A 
10001    B 
10001    C 
10002    D 
10002    A 
10001    F 
10001    X 
10002    N 

Was ich in der Ausgabe wollen, ist der Reihenfolge des Auftretens eines gesonderten ID in aufeinanderfolgenden Zeilenfolge und die Zählungen in dass das Auftreten:

ID    Product Order_occurrence Count 
10001    A   1    3 
10001    B   1    3 
10001    C   1    3 
10002    D   1    2 
10002    A   1    2  
10001    F   2    2 
10001    X   2    2 
10002    N   2    1 

Wir können die Zählung durch Gruppe erhalten, indem bei ID und Vorkommen, aber nicht sicher, wie das Auftreten zu bekommen, das in der Reihenfolge der Zeilen ist. Mir ist nichts bekannt wie Lag-Funktion in Python.

+0

Können Sie die Logik hinter 'Order_occurrence' erklären? – DeepSpace

+0

Denken Sie, dass es 50 eindeutige IDs in den Daten gibt, deren Auftreten an jedem Punkt für verschiedene Produkte wiederholt werden kann. Also möchte ich die Bestellung für jede ID erfassen, was so aussehen könnte, als hätte ID verschiedene Produkte an verschiedenen Tagen gekauft. Also alle Produkte aufeinander folgenden IDs sind ein einziges Vorkommen und erhöht sich, wenn wir diese ID wieder sehen, wenn wir die verschiedenen Zeilen in Spalte ID durchlaufen – muni

+0

Es tut mir leid, aber ich sehe immer noch nicht, warum würde 'ID 10001' für' Produkt A - C' wird '1' und' 10001 F' wird '2'. – DeepSpace

Antwort

1

Dies erstellt Gruppen von Linien mit der gleichen ID, erinnert sich an die Vorkommen und fügt die Gruppengröße am Ende hinzu.

def occCount(db): 
    occ = {} 
    last = db[0][0] if db != [] else None 
    group = [] 
    res = [] 
    for i, p in db: 
     if i not in occ.keys(): 
      occ[i] = 0 
     # Add item to group 
     if i == last: 
      group.append((i, p)) 
     # Handle change 
     else: 
      occ[last] += 1 
      res += [ (j, q, occ[last], len(group)) for j,q in group] 
      group = [(i, p)] 
      last = i 
    # Handle the last group 
    occ[last] += 1 
    res += [ (j, q, occ[last], len(group)) for j,q in group] 
    return res 

Die obige Funktion akzeptiert eine Liste von Tupeln (ID, Produkt). Um es zu testen:

import re 
s = """ID    Product 
10001    A 
10001    B 
10001    C 
10002    D 
10002    A 
10001    F 
10001    X 
10002    N""" 
db = [ re.sub(r"\s+", ' ', l).split() for l in s.split('\n')[1:] ] 

for o in occCount(db): 
    print(o) 

> ('10001', 'A', 1, 3) 
> ('10001', 'B', 1, 3) 
> ('10001', 'C', 1, 3) 
> ('10002', 'D', 1, 2) 
> ('10002', 'A', 1, 2) 
> ('10001', 'F', 2, 2) 
> ('10001', 'X', 2, 2) 
> ('10002', 'N', 2, 1) 
+0

aus irgendeinem Grund wiederholt, erkennt es nicht Split: "'DataFrame' Objekt hat kein Attribut 'split' " – muni

+0

Danke, ich habe den Teil von der Umwandlung in Tupel und zurück vergessen. Scheint zu arbeiten !! – muni