2015-03-29 26 views
6

Pracuję z zestawem danych e-mail Enron i próbuję usunąć adresy e-mail, które nie mają "@ enron.com" (tj. Chciałbym mieć tylko e-maile enronowe). Kiedy próbowałem usunąć te adresy bez @ enron.com, niektóre wiadomości e-mail właśnie zostały pominięte z pewnych powodów. Poniżej przedstawiono mały wykres, w którym wierzchołki są adresem e-mail. To jest w formacie GML:Python igraph: usuń wierzchołki z wykresu

Creator "igraph version 0.7 Sun Mar 29 20:15:45 2015" 
Version 1 
graph 
[ 
    directed 1 
    node 
    [ 
    id 0 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 1 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 2 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 3 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 4 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 5 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 6 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 7 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 8 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 9 
    label "[email protected]" 
    ] 
    edge 
    [ 
    source 5 
    target 5 
    weight 1 
    ] 
] 

Mój kod to:

G = ig.read("enron_email_filtered.gml") 
for v in G.vs: 
    print v['label'] 
    if '@enron.com' not in v['label']: 
     G.delete_vertices(v.index) 
     print 'Deleted' 

W tym zbiorze, 7-maile powinny zostać usunięte. Jednak na podstawie powyższego kodu usunięto tylko 5 e-maili.

+1

I nie myśl, że możesz usuwać wierzchołki podczas iteracji nad 'G.vs'. Spróbuj je zebrać, a następnie usuń wszystkie naraz. –

+0

To prawda - modyfikacje zestawu wierzchołków podczas iteracji na 'G.vs' dają nieprzewidywalne wyniki. –

Odpowiedz

5

z samouczka here, można uzyskać dostęp do wszystkich wierzchołków z konkretnej nieruchomości, a następnie usuń je zbiorczo następująco:

to_delete_ids = [v.index for v in G.vs if '@enron.com' not in v['label']] 
G.delete_vertices(to_delete_ids) 

Oto wynik mam:

to delete ids: [1, 3, 4, 5, 7, 8, 9] 
Before deletion: IGRAPH D-W- 10 1 -- 
+ attr: id (v), label (v), weight (e) 
+ edges: 
5->5 
After deletion: IGRAPH D-W- 3 0 -- 
+ attr: id (v), label (v), weight (e) 
label: [email protected] 
label: [email protected] 
label: [email protected] 
+2

Mam podobny problem, ale chcę usunąć wierzchołki, które nie mają krawędzi. Coś jak "to delete_ids = [v.index dla v w g_groups_all.vs, jeśli v HAS NO EDGES]" Jakieś pomysły? @Jey @Brian Tompsett? –

+2

@B_Furtado użyj g.vs.find (_degree = 0). –