ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 将具有属性和边缘的节点从DataFrame加载到NetworkX

2019-10-04 23:55:57  阅读:625  来源: 互联网

标签:python pandas graph networkx


我是使用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
...

>然后从表/电子表格加载边缘,使用与节点电子表格的列ID中的节点相同的名称,通常有四列(目标,来源,重量和类型):

Target;Source;Weight;Type
per1;per2;3;Undirected
per3;per4;2;Undirected
...

这是我拥有的两个数据帧,我想用Python加载它们.阅读关于NetworkX,似乎不太可能将两个表(一个用于节点,一个用于边缘)加载到同一个图表中,我不确定最好的方法是什么:

>我是否应该仅使用DataFrame中的节点信息创建图形,然后添加(追加)来自其他DataFrame的边缘?如果是这样,并且因为nx.from_pandas_dataframe()需要有关边的信息,我想我不应该用它来创建节点……我应该只是将信息作为列表传递?
>我是否应该仅使用DataFrame中的边信息创建图形,然后将来自其他DataFrame的信息作为属性添加到每个节点?有没有比迭代DataFrame和节点更好的方法呢?

解决方法:

使用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')

然后使用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())

或者迭代图形以添加节点属性:

for i in sorted(G.nodes()):
    G.node[i]['name'] = nodes.name[i]
    G.node[i]['gender'] = nodes.gender[i]

更新:

从nx 2.0开始,nx.set_node_attributes的参数顺序为changed:(G,values,name = None)

使用上面的例子:

nx.set_node_attributes(G, pd.Series(nodes.gender, index=nodes.node).to_dict(), 'gender')

标签:python,pandas,graph,networkx
来源: https://codeday.me/bug/20191004/1854473.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有