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

标签 python pandas graph networkx

我是使用 Python 处理图形的新手:NetworkX。到目前为止,我一直在使用 Gephi。那里的标准步骤(但不是唯一可能的)是:

  1. 从表格/电子表格加载节点信息;其中一列应该是 ID,其余列是关于节点的元数据(节点是人,所以性别,组......通常用于着色)。喜欢:

    id;NormalizedName;Gender
    per1;Jesús;male
    per2;Abraham;male
    per3;Isaac;male
    per4;Jacob;male
    per5;Judá;male
    per6;Tamar;female
    ...
    
  2. 然后也从表/电子表格加载边,使用与通常有四列(目标、源、权重和类型)的节点电子表格的列 ID 中相同的节点名称:

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

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

  1. 我是否应该仅使用来自 DataFrame 的节点信息创建一个图形,然后添加(追加)来自另一个 DataFrame 的边?如果是这样,并且由于 nx.from_pandas_dataframe() 需要有关边的信息,我想我不应该使用它来创建节点...我应该只将信息作为列表传递吗?

  2. 我是否应该仅使用来自 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')

nx 2.4 开始,G.node[] is replaced by G.nodes[].

关于python - 将具有属性和边的节点从 DataFrame 加载到 NetworkX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42558165/

相关文章:

python - 如何让对象属性在 Python 中动态更新

Pandas - 展平从 apply loc 操作返回的数据帧的对角线值

python - 类型错误 : '_AtIndexer' object is not callable in pandas

algorithm - 有两个条件的最短路径问题

c++ - 是否可以检查两个二叉树在线性时间内是否同构?

Python字典检查键是否存在

Python 读取 csv 以听写引号丢失

python蜘蛛返回空json文件

python - 部分重命名 Pandas DataFrame 中的列

java - 如何获取斯坦福解析器输出作为节点和边的列表?