2016-08-03 2 views
0

내가 가진 파일로 dataframe 내가 노드와 체인을 생성하고이 파일에 쓸하려고 graphviz를 : 쓰기 결과는

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 новости 

. 나는 그것은 this file 을 반환

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

사용하지만 ID의 번호와 같은, 파일에 저장합니다. 파일 111, 222, 333을 가져와야합니다. 시도해보십시오

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

하지만 제대로 작동하지 않습니다. 그것은 노드가 3 개있는 과 333 체인으로 되돌아 가야하지만, 파일에서는 2 노드가있는 체인이 111333이됩니다. 이 파일에 111 : result 내가 뭘 잘못하고 어떻게 해결할 수 있습니까?

답변

2

f = Digraph(...)f.render(...)if-statement 안에 넣지 마십시오. if-statement 안에있는 코드는 모든 가장자리에 대해 한 번 실행해야합니다. 새 Digraph을 만들고 모든 가장자리에 렌더링하지 않으려합니다.

대신 df.groupby을 사용하여 팬더가 동일한 ID 행을 식별하도록 할 수 있습니다. [I] 그룹 [ '도메인'] [내가 + 1], 라벨 그룹 [ '도메인'] (

는이 문자열에 오류를 반환
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

'f.edge : 그런 다음 모든 그룹에 대해 한 번 f = Digraph(...)f.render(...) 전화 = group [ 'search_term'] [i + 1])''KeyError : 0L' – ldevyataykina

+0

내 실수. 나는 iloc을 생략했다 : group [ 'domain'] [i]'대신'group [ 'domain'] .iloc [i]'를 사용하라. 'iloc'은 위치 (서수) 색인을 사용합니다. 'iloc'이 없으면 인덱싱은 레이블 기반입니다. – unutbu

+0

도움에 감사드립니다! – ldevyataykina