2017-03-02 83 views
5

Jestem nowy przy użyciu Pythona do pracy z wykresami: NetworkX. Do tej pory używałem Gephi. Tam standardowe kroki (ale nie jedyne możliwe) to:Ładowanie węzłów z atrybutami i krawędziami z DataFrame do NetworkX

  1. Załaduj informacje o węzłach z tabeli/arkusza kalkulacyjnego; jedna z kolumn powinna być identyfikatorem, a reszta to metadane dotyczące węzłów (węzły to ludzie, więc płeć, grupy ... zwykle używane do kolorowania). Jak:

    id;NormalizedName;Gender 
    per1;Jesús;male 
    per2;Abraham;male 
    per3;Isaac;male 
    per4;Jacob;male 
    per5;Judá;male 
    per6;Tamar;female 
    ... 
    
  2. Następnie załaduj krawędzie również z tabeli/arkusza kalkulacyjnego, przy użyciu tych samych nazw dla węzłów, jak to było w ID kolumnie arkusza węzłów z normalnie cztery kolumny (cel, Source, waga i typ):

    Target;Source;Weight;Type 
    per1;per2;3;Undirected 
    per3;per4;2;Undirected 
    ... 
    

To są dwa dataframes że mam i że chcę, aby załadować w Pythonie. Czytając o NetworkX, wydaje się, że nie jest to całkiem możliwe, aby załadować dwie tabele (jeden dla węzłów, jeden na krawędziach) na tym samym wykresie i nie jestem pewien, co byłoby najlepszym sposobem:

  1. należy utworzyć wykres tylko z informacjami o węzłach z DataFrame, a następnie dodać (dołączyć) krawędzie z innej DataFrame? Jeśli tak, a ponieważ nx.from_pandas_dataframe() oczekuje informacji o krawędziach, to chyba nie powinienem go używać do tworzenia węzłów ... Czy powinienem przekazywać informacje jako listy?

  2. Czy mogę utworzyć wykres tylko z informacjami o krawędziach z DataFrame, a następnie dodać do każdego węzła informacje z innych DataFrame jako atrybuty? Czy istnieje lepszy sposób robienia tego niż iterowanie przez DataFrame i węzły?

Odpowiedz

8

Utwórz wykres ważoną z tabeli krawędzi za pomocą nx.from_pandas_dataframe:

import networkx as nx 
import pandas as pd 

edges = pd.DataFrame({'source' : [0, 1], 
         'target' : [1, 2], 
         'weight' : [100, 50]}) 

nodes = pd.DataFrame({'node' : [0, 1, 2], 
         'name' : ['Foo', 'Bar', 'Baz'], 
         'gender' : ['M', 'F', 'M']}) 

G = nx.from_pandas_dataframe(edges, 'source', 'target', 'weight') 

Następnie dodać atrybuty węzeł ze słowników korzystając set_node_attributes:

nx.set_node_attributes(G, 'name', pd.Series(nodes.name, index=nodes.node).to_dict()) 
nx.set_node_attributes(G, 'gender', pd.Series(nodes.gender, index=nodes.node).to_dict()) 

Albo iteracyjne nad wykresem, aby dodać atrybuty węzła:

for i in sorted(G.nodes()): 
    G.node[i]['name'] = nodes.name[i] 
    G.node[i]['gender'] = nodes.gender[i] 
+0

Awesome, thanks! Lista moich węzłów obejmuje także niektóre węzły, których czasami nie potrzebuję, więc najpierw zrobiłem listę wszystkich nazw węzłów z krawędzi i filtrowałem tabelę węzłów, używając tych informacji: 'entities_edges = posortowane (lista (ustaw (krawędzie ["Cel"]. tolist() + krawędzie ["Źródło"]. tolist()))); węzły = pd.read_csv (katalog_wejściowy + węzły_pliku, kodowanie = "utf-8", sep = "\ t"); węzły = węzły [węzły ['id']. Isin (entity_edges)]; ' A potem podążałem za tym, co powiedziałeś. Co o tym myślisz? Wielkie dzięki za odpowiedź! –

+0

Wydaje się poprawne na pierwszy rzut oka. Zawsze możesz filtrować je później w Gephi, ponieważ ich stopień będzie zerowy. –

+0

Jeśli używasz podejścia słownikowego z 'set_node_attributes', nie musisz się martwić o węzły, które nie są zawarte w' entity_edges'. Niepołączone węzły mogą być następnie usunięte z wykresu za pomocą 'G.remove_nodes_from (nx.isolates (G))'. – harryscholes