我使用networkx.add_edge(),但没有添加任何边缘?为什么呢?

时间:2017-12-20 06:26:16

标签: python networkx edges

import networkx as net

def get_Children(g, df):
    for i in range(0, (df.iloc[:,0].size)-1):
        f1 = df.iloc[i]['firm1']
        f2 = df.iloc[i]['firm2']
        if f1 != f2:     
            if df.iloc[i]['children'] == 1.0:
                g.add_edge(f1, f2)
            else: continue
    return g
g = net.Graph()
g.add_nodes_from(index)
get_Children(g, df)

这样的数据:

坚定的公司2个孩子

  • firm1 firm2 children
  • 1 2 0
  • 1 3 1
  • 1 4 0
  • 2 3 1
  • 2 1 0
  • 2 4 1
  • 3 1 0
  • 3 2 0
  • 3 4 0
  • 4 1 0
  • 4 2 0
  • 4 3 0

如果firm1是firm2的子女,则获得1,否则为0。

但是我使用上面的函数添加任何边缘。

在[177]中:g.edges()

输出[177]:EdgeView([])

1 个答案:

答案 0 :(得分:0)

我试图在这里重现您的代码,而且我似乎能够使用您提供的代码主要使用add_edge()生成边缘:

import pandas as pd
import networkx as nx 

df = pd.DataFrame({'firm1':[1,1,1,2,2,2,3,3,3,4,4,4], 
                   'firm2':[2,3,4,3,1,4,1,2,4,1,2,3], 
                   'children':[0,1,0,1,0,1,0,0,0,0,0,0]})

这给出了您提供的DataFrame:

    children    firm1   firm2
0   0   1   2
1   1   1   3
2   0   1   4
3   1   2   3
4   0   2   1
5   1   2   4
6   0   3   1
7   0   3   2
8   0   3   4
9   0   4   1
10  0   4   2
11  0   4   3

我复制了剩下的代码,我唯一改变的就是将index替换为[1,2,3,4](以及net替换为nx,这是NetworkX的惯例包:

def get_Children(g, df):
    for i in range(0, (df.iloc[:,0].size)-1):
        f1 = df.iloc[i]['firm1']
        f2 = df.iloc[i]['firm2']
        if f1 != f2:     
            if df.iloc[i]['children'] == 1.0:
                g.add_edge(f1, f2)
            else: continue
    return g

g = nx.Graph()
g.add_nodes_from([1,2,3,4])
get_Children(g, df)
g.edges()

g.edges()导致:

EdgeView([(1, 3), (2, 3), (2, 4)])

我使用Python 3来重现这一点。也许您使用index的错误值?