2017-01-06 92 views
1

我正在繪製具有邊緣權重的網絡x圖形,我想累計累加權重。下面的代碼只獲取邊的最後一個權重,但累計和。有5個節點和3個邊。邊緣爲('A', 'B'), ('A', 'D'),('C', 'E'),權重爲[1, 1, 1]。我想要的重量是[2, 2, 1]而不是[1, 1, 1]。需要幫忙。韓國社交協會。在累積和的邊緣上的網絡x權重

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) 

enter image description here

回答

1

所以,我不認爲你可以直接做的累加值與nx.from_pandas_dataframe,至少咋一看爲文件後。

但是,您可以在pandas中執行該操作,然後將其傳遞到networkx

既然你說你要的重量是[2,2,1],這意味着你正在考慮中的圖形無向,所以你必須確保第一:

df["a'"] = pd.DataFrame([df["a"], df["b"]]).min() 
df["b'"] = pd.DataFrame([df["a"], df["b"]]).max() 

然後,你可以做的累積和用一個簡單的groupby

012:

df = df.groupby(by = ["a'", "b'"]).sum().reset_index() 

此時,df將被正確地通過nx.from_pandas_dataframe轉換

+0

很棒,@Mikk,TKS。 –