2016-08-03 21 views
0

Ich habe DatenrahmenGraphviz: Schreiber

ID domain search_term 
111 vk.com вконтакте 
111 twitter.com фэйсбук 
111 facebook.com твиттер 
222 avito.ru купить машину 
222 vk.com вконтакте 
333 twitter.com твиттер 
333 apple.com купить айфон 
333 rbk.ru новости 

Ich versuche, eine Datei Kette mit Knoten zu erstellen und schreiben Sie es in Datei. Ich benutze

domains = df['domain'].values.tolist() 
search_terms = df['search_term'].values.tolist() 
ids = df['ID'].values.tolist() 
f = Digraph('finite_state_machine', filename='fsm.gv', encoding='utf-8') 
f.body.extend(['rankdir=LR', 'size="5,5"']) 
f.attr('node', shape='circle') 
for i, (id, domain, search_term) in enumerate(zip(ids, domains, search_terms)): 
    if ids[i] == ids[i - 1]: 
     f.edge(domains[i - 1], domains[i], label=search_terms[i]) 
f.view() 

Es gibt this file Aber ich will es zu einer Datei speichern, wie die Anzahl der ID. Ich brauche Datei 111, 222, 333. Ich versuche

for i, (id, domain, search_term) in enumerate(zip(ids, domains, search_terms)): 
if ids[i] == ids[i - 1]: 
    f = Digraph('finite_state_machine', filename='fsm.gv', encoding='utf-8') 
    f.body.extend(['rankdir=LR', 'size="5,5"']) 
    f.attr('node', shape='circle') 
    f.edge(domains[i - 1], domains[i], label=search_terms[i]) 
    f.render(filename=str(id)) 

Aber es funktioniert falsch. Es sollte zu 111 und 333 Kette mit 3 Knoten zurückkehren, aber in Datei bekomme ich Ketten mit 2 Knoten zu 111 und 333. Diese Datei zu 111: result Was mache ich falsch und wie kann ich das beheben?

Antwort

2

Setzen Sie f = Digraph(...) und f.render(...) nicht innerhalb der if-statement. Der Code innerhalb der if-statement sollte einmal für jede Kante ausgeführt werden. Sie möchten kein neues Digraph erstellen und für jede Kante rendern.

Stattdessen können Sie df.groupby verwenden Pandas identifizieren die Zeilen mit dem gleichen ID. Dann ruft f = Digraph(...) und f.render(...) einmal für jede Gruppe:

for id_key, group in df.groupby('ID'): 
    f = Digraph('finite_state_machine', filename='fsm.gv', encoding='utf-8') 
    f.body.extend(['rankdir=LR', 'size="5,5"']) 
    f.attr('node', shape='circle') 
    for i in range(len(group)-1): 
     f.edge(group['domain'].iloc[i], group['domain'].iloc[i+1], 
       label=group['search_term'].iloc[i+1]) 
    f.render(filename=str(id_key)) 
+0

es gibt Fehler zu dieser Zeichenfolge 'f.edge (Gruppe [ 'domain'] [i], Gruppe [ 'domain'] [i + 1], Etikett = group ['search_term'] [i + 1]) '' KeyError: 0L' – ldevyataykina

+0

Mein Fehler. Ich habe die "ilocs" weggelassen: Benutze 'group ['domain']. Iloc [i]' anstelle von 'group ['domain'] [i]'. 'iloc' verwendet eine Positionsindexierung (ordinal). Ohne das "Iloc" ist die Indizierung labelbasiert. – unutbu

+0

danke für die Hilfe! – ldevyataykina