Graphviz:将结果写入文件
Graphviz: write result to file
我有数据框
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()
它returns
但是我想将它保存到文件中,比如 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))
但是它工作不正常。它应该 return 到 111
和 333
有 3 个节点的链,但是在文件中我得到有 2 个节点的链到 111
和 333
。此文件到 111
:
我做错了什么,我该如何解决?
不要把f = Digraph(...)
和f.render(...)
放在if-statement
里面。 if-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))
我有数据框
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()
它returns 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))
但是它工作不正常。它应该 return 到 111
和 333
有 3 个节点的链,但是在文件中我得到有 2 个节点的链到 111
和 333
。此文件到 111
:
不要把f = Digraph(...)
和f.render(...)
放在if-statement
里面。 if-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))