Graphviz:将结果写入文件

时间:2016-08-03 12:24:00

标签: python pandas matplotlib 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  новости

我尝试用节点创建链并将其写入文件。我用

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

返回this file 但我想将其保存到文件中,例如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个节点的111333链,但是在文件I中,我会得到包含2个节点到111333的链。此文件发送到111result 我做错了什么,我该如何解决?

1 个答案:

答案 0 :(得分:2)

请勿将f = Digraph(...)f.render(...)放入if-statementif-statement内的代码应该为每个边执行一次。您不想创建新的Digraph并为每个边缘渲染它。

相反,您可以使用df.groupby让Pandas识别具有相同ID的行。然后为每个小组拨打f = Digraph(...)f.render(...)一次:

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