2017-01-06 4 views
1

Ich zeichne ein Netzwerkx-Diagramm mit Gewichten an Kanten, die ich kumulativ summieren möchte. Der folgende Code erhält nur das letzte Gewicht der Kanten, aber die kumulative Summe. Es gibt 5 Knoten und 3 Kanten. Die Kanten sind ('A', 'B'), ('A', 'D') und ('C', 'E'), und das Gewicht ist [1, 1, 1]. Was ich will, ist das Gewicht [2, 2, 1] nicht [1, 1, 1]. Brauche Hilfe. Tks.Networkx Gewichte auf Kanten mit kumulativen Summe

1. Erstellen Sie eine 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. eine Grafik zeichnen.

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

Antwort

1

Also, ich glaube nicht, dass Sie eine kumulative Summe mit nx.from_pandas_dataframe direkt zu tun, zumindest nach einem kurzen Blick auf die Dokumentation.

Sie können dies jedoch in pandas tun, bevor Sie es an networkx übergeben.

Da Sie gesagt, dass Sie Gewichte [2,2,1] sein wollen, bedeutet dies, Sie in Betracht ziehen Sie die Grafik als ungerichtete, so dass Sie sicherstellen müssen, dass zuerst:

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

Dann können Sie die kumulative Summe tun mit einem einfachen groupby:

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

An diesem Punkt wird df richtig durch nx.from_pandas_dataframe umgewandelt:

G = nx.from_pandas_dataframe(df, "a'", "b'", ['weight']) 
[G[u][v]['weight'] for u,v in edges] 
+0

Großartig, @Mikk, TKS. –

Verwandte Themen