Jos*_*osé 12 python graph networkx pandas
我是使用Python处理图形的新手:NetworkX.到现在为止我使用过Gephi.标准步骤(但不是唯一可行的)是:
从表/电子表格加载节点信息; 其中一列应该是ID,其余的是关于节点的元数据(节点是人,因此性别,组...通常用于着色).喜欢:
id;NormalizedName;Gender
per1;Jesús;male
per2;Abraham;male
per3;Isaac;male
per4;Jacob;male
per5;Judá;male
per6;Tamar;female
...
Run Code Online (Sandbox Code Playgroud)然后从表/电子表格加载边缘,使用与节点电子表格的列ID中的节点相同的名称,通常有四列(目标,来源,重量和类型):
Target;Source;Weight;Type
per1;per2;3;Undirected
per3;per4;2;Undirected
...
Run Code Online (Sandbox Code Playgroud)这是我拥有的两个数据帧,我想用Python加载它们.阅读关于NetworkX,似乎不太可能将两个表(一个用于节点,一个用于边缘)加载到同一个图表中,我不确定最好的方法是什么:
我应该仅使用DataFrame中的节点信息创建图形,然后添加(追加)来自其他DataFrame的边缘吗?如果是这样,并且因为nx.from_pandas_dataframe()需要有关边的信息,我想我不应该用它来创建节点......我应该只是将信息作为列表传递?
我是否应该仅使用DataFrame中的边信息创建图形,然后将来自其他DataFrame的信息作为属性添加到每个节点?有没有比迭代DataFrame和节点更好的方法呢?
har*_*les 20
使用边缘表创建加权图nx.from_pandas_dataframe:
import networkx as nx
import pandas as pd
edges = pd.DataFrame({'source' : [0, 1],
'target' : [1, 2],
'weight' : [100, 50]})
nodes = pd.DataFrame({'node' : [0, 1, 2],
'name' : ['Foo', 'Bar', 'Baz'],
'gender' : ['M', 'F', 'M']})
G = nx.from_pandas_dataframe(edges, 'source', 'target', 'weight')
Run Code Online (Sandbox Code Playgroud)
然后使用以下命令添加字典中的节点属性set_node_attributes:
nx.set_node_attributes(G, 'name', pd.Series(nodes.name, index=nodes.node).to_dict())
nx.set_node_attributes(G, 'gender', pd.Series(nodes.gender, index=nodes.node).to_dict())
Run Code Online (Sandbox Code Playgroud)
或者迭代图形以添加节点属性:
for i in sorted(G.nodes()):
G.node[i]['name'] = nodes.name[i]
G.node[i]['gender'] = nodes.gender[i]
Run Code Online (Sandbox Code Playgroud)
截至nx 2.0论点顺序nx.set_node_attributes已发生变化:(G, values, name=None)
使用上面的例子:
nx.set_node_attributes(G, pd.Series(nodes.gender, index=nodes.node).to_dict(), 'gender')
Run Code Online (Sandbox Code Playgroud)
这里的答案基本相同,但更新了一些细节。我们将从基本相同的设置开始,但这里不会有节点索引,只有名称来解决@LancelotHolmes 评论并使其更通用:
import networkx as nx
import pandas as pd
linkData = pd.DataFrame({'source' : ['Amy', 'Bob'],
'target' : ['Bob', 'Cindy'],
'weight' : [100, 50]})
nodeData = pd.DataFrame({'name' : ['Amy', 'Bob', 'Cindy'],
'type' : ['Foo', 'Bar', 'Baz'],
'gender' : ['M', 'F', 'M']})
G = nx.from_pandas_edgelist(linkData, 'source', 'target', True, nx.DiGraph())
Run Code Online (Sandbox Code Playgroud)
这里的True参数告诉 NetworkX 将 linkData 中的所有属性保留为链接属性。在这种情况下,我已将其设为一种DiGraph类型,但如果您不需要它,那么您可以以明显的方式将其设为另一种类型。
现在,由于您需要通过从 linkData 生成的节点的名称来匹配 nodeData,您需要将 nodeData 数据帧的索引设置为name属性,然后将其设置为字典,以便 NetworkX 2.x 可以将其加载为节点属性。
nx.set_node_attributes(G, nodeData.set_index('name').to_dict('index'))
Run Code Online (Sandbox Code Playgroud)
这将整个 nodeData 数据帧加载到字典中,其中键是名称,其他属性是该键内的键:值对(即,节点索引是其名称的普通节点属性)。
一个小说明:
from_pandas_dataframe 在 nx 2 中不起作用,指的是这个
G = nx.from_pandas_dataframe(edges, 'source', 'target', 'weight')
Run Code Online (Sandbox Code Playgroud)
我认为在 nx 2.0 中它是这样的:
G = nx.from_pandas_edgelist(edges, source = "Source", target = "Target")
Run Code Online (Sandbox Code Playgroud)