前回の記事の続き。
pandasからnetworkxのデータへ直接流し込みが可能なfrom_pandas_edgelist。
import networkx as nx
edges = pd.DataFrame({'source': ["A","A","A","B","B","C","C","D","E"],
'target': ["B","C","D","D","C","E","D","E","A"]})
G = nx.from_pandas_edgelist(edges, edge_attr=True)
これでedgeのリストからnetworkxの形式のデータへ変換できる。
が、エッジの属性は指定できるが、ノードの属性(サイズとか重みとか色とか)の指定ができない。
どうすればいいのか迷った結果、下記のように、ノードとその属性を表すdataframeを作ってから、to_dictを使ってdic形式に出力
nodes = pd.DataFrame({'node':["A","B","C","D","E"],
'weight':[1,2,1,4,3],
'color':["red","red","yellow","blue","~~"],
'label':["a","b","c","d","e"]})
node_attr_dic = nodes.set_index("node").to_dict(orient="index")
で、これらを組み合わせるのは以下のとおり。
nx.set_node_attributes(G, node_attr_dic)
ミソは、
- edgelistから生成した(edgelistに存在する)Gのノード名とnodesの列の1つに入っているノード名を同じにした上で、set_node_attributesでノードに属性を設定する。
- その列をnodesのindex列に指定する点(例で言えば「node」の列)+to_dictの出力で、orient="index"にする点。
node_attr_dicの中身は下記のような感じで、node:{各属性の値}という感じに入っている辞
書を使えばよい。
あとは、graphmlなどネットワーク系の拡張子で出してもよいし、前回どうようpyvisで出力してもいい。これも今度書こうと思う。
networkxの開発者はpandasのto_dictを組み合わせることを念頭にX2.~系では
from_pandas_edgelistを追加したのだろうか?頭いいなあ。
networkx様様<(_ _)>
追記:少し修正があったので別の記事で