2016-04-18 13 views
0

Ich habe einen Datensatz von Organisationen, die durch ihre gemeinsamen Beziehungen in verschiedenen Komitees verbunden sind. Die Daten werden in diesem Format (etwas vereinfacht):Verschachtelte Schleifen mit Pandas, die zu viel Speicher verwenden

organization name | committee name  | number of relationships 
ABC Corporation | Committee A   | 7 
ACME Inc.   | Committee B   | 3 
XYZ Corporation | Committee A   | 2 

Dies ist derzeit in einem pandas Datenrahmen mit etwa 30K Zeilen.

Ich muss den Datenrahmen ändern, Art von invertieren, damit ich eine Netzwerkanalyse in R unter Verwendung igraph tun kann. Für diese Analyse sind zwei Dateien erforderlich, von denen eine alle Knoten auflistet und die andere die Kanten oder Beziehungen zwischen den Knoten auflistet. Um das jetzt zu tun, verwende ich zwei verschachtelte Schleifen mit itertuples, um einen neuen Datenrahmen zu erstellen, der aufzeichnet, wie Organisationen miteinander verwandt sind, d. H. Sie sind in denselben Komitees.

Dies ist der Code (mit Ausnahme, wie ich die Daten nach dem Import und dann Griff zu verfeinern nach diesem Export):

list_ = [] 
node_list = [] 
for row_a in network_df.itertuples(): 
    for row_b in network_df.itertuples(): 
     node_list.append({'node':row_a[1]}) 
     if row_a[2] == row_b[2] && row_a[1] != row_b[1]: 
      temp_dict = {'from':row_a[1],'to':row_b[1], 'rels':row_a[3]} 
      list_.append(temp_dict) 

edge_df = pd.DataFrame(list_) 
node_df = pd.DataFrame(node_list) 

Hier ist das Problem: dieser Prozess nie abgeschlossen ist, Pandas endet Aufnahme über 30 GB Gedächtnis und schließlich muss ich nur die Prozesse beenden.

Ich weiß, dass das Iterieren über einen Pandas Datenrahmen es falsch macht, aber ich bin mir nicht sicher, wie man diese Daten invertiert, ohne Loops zu verschachteln. Ist die Lösung, native Python-Listen oder Wörterbücher zu verwenden und verschachtelte Schleifen mit diesen zu verwenden? Selbst bei 30k-Zeilen scheint es nicht so, als würde es diese Art von Speicher-Overhead benötigen.

+1

Warum Sie bauen ein 'node_list' mit fast einer Milliarde Einträge? Sie haben vielleicht das 'node_list.append' oder so etwas verlegt. – user2357112

+0

Das klingt wie ein Job für ein 'groupby'. – user2357112

+0

@ user2357112 Sie haben Recht auf der falsch platzierten 'node_list'. Ich habe meine Deduplizierung am Ende der Schleife, die ineffizient ist. – tchaymore

Antwort

1

Das Problem ist mit list.append. Sie können Pythons NetworkX-Paket verwenden.

import networkx as nx 
G = nx.from_pandas_frame(df, sorce_col_name, target_col_name) 

, wenn Sie die Grafik zu erhalten, können Sie auch weiterhin NetworkX nutzen oder seinen Knoten/Keile extrahieren und speichern Sie sie für die weitere Analyse csv

+0

basierend auf Problembeschreibung, ich denke, Quelle und Ziel müssen aus einer einzigen Spalte umgewandelt werden; korrigiere ich @tchaymore? –

+0

@PhilChang Ich habe networkx nicht versucht, aber ich habe in Python versucht, ein Netzwerk mit Hilfe von igraph zu erstellen, und es war immer noch ziemlich langsam. – tchaymore