在创建 NetworkX 图之前从相同的边添加权重

Add weights from same edges before creating NetworkX graph

我有一个数据框如下,我使用有向图。

在这种情况下,您会发现第一行和最后一行中的“1”和“3”之间存在相同的交互。

我发现 nx.degree() 函数仅适用于相同节点交互的最后一个事件。

我想 degree() 考虑 networkx 语法中相同节点之间的所有事件。

  sender receiver  amt
0      1        3   50
3      2        1    1
4      1        3  100
test = pd.DataFrame({'sender' : ['1','2','1'], 
                   'receiver' : ['3','1','3'], 
                   'amt' : [50,1,100]})

H = nx.from_pandas_edgelist(test, source = 'sender', target = 'receiver',
                            create_using=nx.DiGraph(), edge_attr = 'amt')

H.out_degree(weight = 'amt')
# this is a result :  {'1': 100, '3': 0, '2': 1}
# However I want to get this result : {'1': 150, '3': 0, '2': 1}

你得到那个度数是因为只考虑了最后一个边缘。在有向图中不能有多条边连接到相同的端点。考虑到您期望的输出,您可以做的是预先 groupbysum 这些权重:

G = nx.from_pandas_edgelist(test.groupby(['sender','receiver'], as_index=False).amt.sum(), 
                            source = 'sender', 
                            target = 'receiver',
                            create_using=nx.DiGraph(), 
                            edge_attr = 'amt')

G.out_degree(weight = 'amt')
# OutDegreeView({1: 150, 3: 0, 2: 1})