Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将具有属性和边的节点从DataFrame加载到NetworkX_Python_Pandas_Graph_Networkx - Fatal编程技术网

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

Python 将具有属性和边的节点从DataFrame加载到NetworkX,python,pandas,graph,networkx,Python,Pandas,Graph,Networkx,我是使用Python处理图形的新手:NetworkX。到目前为止,我一直在使用Gephi。这些标准步骤(但不是唯一可能的)包括: 从表格/电子表格加载节点信息;其中一列应该是ID,其余的是关于节点的元数据(节点是人,所以性别、组……通常用于着色)。比如: 然后也从表格/电子表格加载边,使用与节点电子表格的列ID中相同的节点名称,通常有四列(目标、源、权重和类型): 这是我拥有的两个数据帧,我想在Python中加载它们。在阅读NetworkX时,似乎不太可能将两个表(一个用于节点,一个用于边)

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

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

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

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

  • 我是否应该仅使用数据帧中的节点信息创建一个图,然后添加(附加)另一个数据帧中的边?如果是这样,并且由于nx.from_pandas_dataframe()需要关于边的信息,我想我不应该使用它来创建节点。。。我应该把信息作为列表传递吗

  • 我是否应该仅使用来自数据帧的边信息创建一个图,然后将来自其他数据帧的信息作为属性添加到每个节点?有没有比遍历数据帧和节点更好的方法


  • 使用以下方法从边表创建加权图:

    然后使用以下命令从字典中添加节点属性:

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

    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(实体_边)]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'))