Python 具有累积和的边上的Networkx权重
我正在绘制一个边上有权重的networkx图,我想将权重累加起来。下面的代码仅获取边的最后一个权重,但不获取累积和。有5个节点和3条边。边缘是Python 具有累积和的边上的Networkx权重,python,pandas,networkx,Python,Pandas,Networkx,我正在绘制一个边上有权重的networkx图,我想将权重累加起来。下面的代码仅获取边的最后一个权重,但不获取累积和。有5个节点和3条边。边缘是('A','B'),('A','D')和('C','E'),权重是[1,1,1]。我想要的重量是[2,2,1]而不是[1,1,1]。我需要帮助。Tks 1。创建df import pandas as pd import networkx as nx ints = [1] * 5 a = ['A', 'B', 'C', 'A', 'A'] b = ['D',
('A','B'),('A','D')
和('C','E')
,权重是[1,1,1]
。我想要的重量是[2,2,1]
而不是[1,1,1]
。我需要帮助。Tks
1。创建df
import pandas as pd
import networkx as nx
ints = [1] * 5
a = ['A', 'B', 'C', 'A', 'A']
b = ['D', 'A', 'E', 'D', 'B']
df = pd.DataFrame(ints, columns=['weight'])
df['a'] = a
df['b'] = b
df
weight a b
0 1 A D
1 1 B A
2 1 C E
3 1 A D
4 1 A B
2。绘制一张图表
G=nx.from_pandas_dataframe(df, 'a', 'b', ['weight'])
edges = G.edges()
weights = [G[u][v]['weight'] for u,v in edges]
pos = nx.circular_layout(G)
nx.draw(G, pos, with_labels=True, width=weights)
因此,我不认为您可以直接使用
nx.从\u pandas\u dataframe
进行累加,至少在快速查看文档之后是这样
但是,在将其传递到networkx
之前,可以在pandas
中执行此操作
由于您说过希望权重为[2,2,1]
,这意味着您认为图形是无向的,因此您必须首先确保:
df["a'"] = pd.DataFrame([df["a"], df["b"]]).min()
df["b'"] = pd.DataFrame([df["a"], df["b"]]).max()
然后,您可以使用一个简单的groupby
:
df = df.groupby(by = ["a'", "b'"]).sum().reset_index()
此时,df
将通过nx正确转换。从数据帧开始:
G = nx.from_pandas_dataframe(df, "a'", "b'", ['weight'])
[G[u][v]['weight'] for u,v in edges]