Python 将具有属性和边的节点从DataFrame加载到NetworkX
我是使用Python处理图形的新手:NetworkX。到目前为止,我一直在使用Gephi。这些标准步骤(但不是唯一可能的)包括:Python 将具有属性和边的节点从DataFrame加载到NetworkX,python,pandas,graph,networkx,Python,Pandas,Graph,Networkx,我是使用Python处理图形的新手:NetworkX。到目前为止,我一直在使用Gephi。这些标准步骤(但不是唯一可能的)包括: 从表格/电子表格加载节点信息;其中一列应该是ID,其余的是关于节点的元数据(节点是人,所以性别、组……通常用于着色)。比如: 然后也从表格/电子表格加载边,使用与节点电子表格的列ID中相同的节点名称,通常有四列(目标、源、权重和类型): 这是我拥有的两个数据帧,我想在Python中加载它们。在阅读NetworkX时,似乎不太可能将两个表(一个用于节点,一个用于边)
使用以下方法从边表创建加权图: 然后使用以下命令从字典中添加节点属性: 或在图形上迭代以添加节点属性:
for i in sorted(G.nodes()):
G.node[i]['name'] = nodes.name[i]
G.node[i]['gender'] = nodes.gender[i]
更新:
从nx2.0
开始,nx.set\u node\u attributes
的参数顺序为:(G,value,name=None)
使用上面的示例:
nx.set_node_attributes(G, pd.Series(nodes.gender, index=nodes.node).to_dict(), 'gender')
从nx2.4
,G.node[]
G.nodes[]
一句小评论:
from_pandas_dataframe在NX2中不起作用,指的是这一个
G = nx.from_pandas_dataframe(edges, 'source', 'target', 'weight')
我认为在nx 2.0中是这样的:
G = nx.from_pandas_edgelist(edges, source = "Source", target = "Target")
这里的答案基本相同,但更新了一些细节。我们将从基本相同的设置开始,但这里没有节点的索引,只有名称来处理@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())
这里的True
参数告诉NetworkX将linkData中的所有属性保留为链接属性。在本例中,我将它制作成一个有向图
类型,但是如果您不需要它,那么您可以以显而易见的方式将它制作成另一个类型
现在,由于需要通过从linkData生成的节点名称来匹配nodeData,因此需要将nodeData dataframe的索引设置为name
属性,然后再将其设置为字典,以便NetworkX 2.x可以将其作为节点属性加载
nx.set_node_attributes(G, nodeData.set_index('name').to_dict('index'))
这会将整个nodeData数据帧加载到一个字典中,其中键是名称,其他属性是该键中的键:值对(即,节点索引是其名称的普通节点属性)。太棒了,谢谢!我的节点列表还包括一些有时我不需要的节点,因此我首先从边中列出所有节点名称,并使用以下信息过滤节点表:
entities_edges=sorted(list(set(edges[“Target”].tolist()+edges[“Source”].tolist());节点=pd.read_csv(输入文件夹+文件节点,编码=“utf-8”,sep=“\t”);nodes=节点[nodes['id'].isin(实体_边)]然后我就按照你说的做了。你觉得怎么样?非常感谢你的回答!!!乍一看似乎是正确的。以后,您可以在Gephi内部对它们进行过滤,因为它们的度将为零。如果您使用字典方法来设置节点属性,则不必担心未包含在实体边中的节点。随后可以使用G从图中删除未连接的节点。从(nx.isolates(G))
@h\u s中删除节点,回答很好,但我想知道如果我没有有意义的索引,我如何使用nx.set\u node\u attributes
方法,或者我只能使用for循环?NetworkX 2.3没有来自\u pandas\u数据帧的。
G = nx.from_pandas_dataframe(edges, 'source', 'target', 'weight')
G = nx.from_pandas_edgelist(edges, source = "Source", target = "Target")
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())
nx.set_node_attributes(G, nodeData.set_index('name').to_dict('index'))