在创建 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}
你得到那个度数是因为只考虑了最后一个边缘。在有向图中不能有多条边连接到相同的端点。考虑到您期望的输出,您可以做的是预先 groupby
和 sum
这些权重:
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})
我有一个数据框如下,我使用有向图。
在这种情况下,您会发现第一行和最后一行中的“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}
你得到那个度数是因为只考虑了最后一个边缘。在有向图中不能有多条边连接到相同的端点。考虑到您期望的输出,您可以做的是预先 groupby
和 sum
这些权重:
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})