【发布时间】:2020-01-02 03:32:48
【问题描述】:
我正在尝试从包含两列和多行的 Excel 工作表生成“佣金共享”组织的图表。左行包含分配给每个代理的唯一 ID。右侧的单元格列出了在左侧单元格中招募代理的代理的唯一 ID。我手动插入了一个新的第 1 行,其中包含以下值: 代理和雇佣人
我使用以下方法将 excel 数据转换为 pandas Edgelist:
import pandas as pd
XL='path to Excel file'
df=pd.read_excel(XL,sheet_name=3)
G=nx.from_pandas_edgelist(df,'agent','hired_by',create_using=nx.Graph)
为了这些目的,使用 nx.Graph 而不是 nx.DiGraph 很重要,因为“连接方向”并不重要。重要的是“级别”,即根节点和代理之间的跳数,用于确定补偿属性。
然后,我可以使用以下代码从根目录逐级确定层次结构,然后可以将其粘贴到工作中的 .dot(有向图)文件中,只需进行少量编辑。在哪里工作,我的意思是它以图形方式分隔各个级别,因为它由以下行组成:
“node01”-> {“node02”、“node03”、“node04”、“node05”、“node06”}
for n in G.nodes():
if len(nx.shortest_path(G, 'node01', n)) == 1:
print(nx.shortest_path(G, 'node01', n),len(nx.shortest_path(G, 'node01', n)))
这会产生如下输出:
"node01" -> {"node02", "node03", "node04", "node05", "node06"} 1
...
"node06" -> {"node10", "node11", "node07"} 2
...
"node17" -> {"node21", "node22"} 4
这很好用,唯一的问题是我必须手动更改上面代码中每个级别的数字“1”,并将输出复制并粘贴到我的 .dot 文件中,然后重新排列行,因为输出不会将所有“级别 3”组合在一起。
目前这是可以接受的混乱程度,但我可能还有更多记录需要处理。
有没有办法让这项工作递归地从一个级别到另一个级别?
谢谢!
【问题讨论】:
-
这个问题还有意义吗?
-
是的。可以告诉我如何对以下代码进行递归,而不必手动增加节点编号:``` //read_excel,然后将 convert_to_pandas_edgelist 作为 Agraph 非有向图 // ///then: for n in G.nodes (): if len(nx.shortest_path(G, 'node01', n)) == 1: /// 我手动增加了这个值 print(nx.shortest_path(G, 'node01', n),len(nx. shortest_path(G, 'node01', n)))
-
我将根据网站指南编辑原始帖子。
标签: pandas networking graphviz python-3.7 dot