2017-05-04 4 views
0

Also habe ich einen Datenrahmen, den ich versuche, in ein Diagramm mit networkx zu setzen. Eine Probe des Datenrahmens ist unten:Versuchen Sie, Kanten und Knoten zum Graphen mit networkx hinzuzufügen

Alabama Alabama 0 
Alabama Alaska 0 
Alabama Arizona 0 
Alabama Arkansas 1 
Alabama California 1 
Alabama Colorado 1 
Alabama Connecticut 0 
Alabama Delaware 0 

Ich versuche es Aufbau zu haben, so dass die 0-en und 1-en sind Kanten zwischen dem entsprechenden Knoten, die in der gleichen Spalte befinden. So Knoten Alabama Alabama hätte eine Selbstschleife von 0, ect. Ich habe versucht,

graph = nx.Graph() graph.add_edges_from([test3])

Aber es gibt mir den Fehler: dtype: int64 ein 2-fach oder 3-fach sein muss.

Wie soll ich dieses Diagramm erstellen, wenn ich bedenke, dass ich diesen Datenrahmen möglicherweise ändern muss.

PS: Dieser Datenrahmen hat 2601 Kanten und alle Staaten in den USA.

+0

können Sie erklären, was eine 0 oder eine 1 bedeutet – Joel

+4

Sie haben soeben entfernt? der [mcve] von deiner Frage Was willst du erreichen? –

Antwort

1

Ich kann nicht genau sagen, was Sie mit einer Kante oder einer Schleife von 0 meinen. Ich nehme an, Sie meinen, dass eine 0 bedeutet keine Kante und eine 1 bedeutet eine Kante. Der Befehl graph.add_edges_from([test3]) erwartet eine Liste von Kanten als Eingabe (etwa [(1,2), (2,3), (1,5)]). Sie geben ihm eine Liste, deren einziger Eintrag test3 ist.

Networkx hat eine eingebaute Funktion zum Einlesen von einem Pandas Datenrahmen, from_pandas_dataframe(df, source, target, edge_attr=None, create_using=None).

Es erwartet jedoch, dass jede Zeile eine Kante ist (wenn Sie nur ein Attribut von 0 oder 1 den Kanten zuweisen möchten, dann sind Sie festgelegt). Überprüfen Sie the documentation.

Wenn Sie meinen, dass eine 0 so interpretiert wird, als hätte sie keine Kante, dann müssen Sie diese Einträge entfernen, bevor Sie diese aufrufen. Andernfalls Sie the source code aussehen kann, und Sie können so ziemlich folgen, außer dass unmittelbar vor dem add_edge Befehl, würden Sie einen Test für hinzufügen, ob der Wert 0 oder 1

glaube ich, die folgenden funktionieren würde (wo df ist die Datenrahmen ist source Name eines Staates Spalte, target Namen anderer Zustand Spalte ist, ist value Name der 0/1 Spalte:

g=nx.Graph() #undirected, no loops. 
src_i = df.columns.get_loc(source) 
tar_i = df.columns.get_loc(target) 
val_i = df.columns.get_loc(value) 
for row in df.values: 
    if row[val_i] == 1: 
     g.add_edge(row[src_i], row[tar_i]) 
Verwandte Themen