2016-04-18 13 views
0

私は、さまざまな委員会の共有関係によってリンクされている組織のデータセットを持っています。データがこのフォーマット(幾分簡略化)である。パンダがあまりにも多くのメモリを使用しているネストループ

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

これは約30K行のpandasデータフレームに現在あります。

私はigraphを使ってRでネットワーク解析を行うことができるように、データフレームを並べ替える必要があります。その分析には、2つのファイルが必要です.1つはすべてのノードをリストし、もう1つはノード間のすべての「エッジ」または関係をリストします。ここでは、itertuplesという2つのネストループを使用して、組織が互いにどのように関係しているかを記録する新しいデータフレームを構築しています。つまり、同じ委員会に属しています。

これは、(私が輸入し、この後にそれをエクスポートした後、データを精緻化処理する方法を除く)のコードです:

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) 

は、ここで問題です:このプロセスが終了したことがない、パンダは30GBの上で取って終わります最終的にはプロセスを終了させるだけです。

私は、パンダのデータフレームを反復することが間違った方法を行っていることは知っていますが、ネストループなしでこのデータを反転させる方法がわかりません。ネイティブのPythonのリストや辞書を使用してネストされたループを使用するソリューションですか? 30k行でも、このようなメモリオーバーヘッドを取るようには見えません。

+1

なぜあなたは、ほぼ億エントリで 'node_list'を構築していますか?あなたは 'node_list.append'か何かを間違って配置したかもしれません。 – user2357112

+0

これは 'groupby'の仕事のようです。 – user2357112

+0

@ user2357112あなたは間違った 'node_list'を正しく読んでいます。私は非効率なループの最後に私の重複排除を持っています。 – tchaymore

答えて

1

問題はlist.appendにあります。 あなたはpythonのnetworkxパッケージを使うことができます。あなたは、グラフを得れば、あなたはnetworkx使用するか、そのノード/ウェッジを抽出するために継続し、さらなる分析のために、CSVに保存することができます

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

+0

問題の記述に基づいて、私は 'source'と' target'を単一の列から変換する必要があると思います。私は正しい@ tchaymoreですか? –

+0

@PhilChang私はnetworkxを試しませんでしたが、Pythonでigraphを使ってネットワークを構築しようとしましたが、まだかなり遅かったです。 – tchaymore

関連する問題