如何在 Networkx 图中生成组件 ID?

问题描述

我有一个使用 Networkx生成的大型图网络。

enter image description here

在这里添加一个样本

import networkx as nx
import pandas as pd

G = nx.path_graph(4)
nx.add_path(G,[10,11,12])

我正在尝试使用节点、度数、组件 ID、组件创建 dataframe

使用创建的度数

degrees = list(nx.degree(G))

data = pd.DataFrame([list(d) for d in degrees],columns=['Node','degree']).sort_values('degree',ascending=False)

使用

提取组件
Gcc = sorted(nx.connected_components(G),key=len,reverse=True)

Gcc
[{0,1,2,3},{10,12}]

并且不确定如何在数据中创建 Component IDcomponents

所需输出

  Node  degree  ComponentID  Components
1   1   2           1         {0,3}
2   2   2           1         {0,3}
5   11  2           2         {10,12}
0   0   1           1         {0,3}
3   3   1           1         {0,3}
4   10  1           2         {10,12}
6   12  1           2         {10,12}

如何生成组件 id 并将它们添加到节点和度数中?

解决方法

通过枚举连接的组件列表来创建 NodeComponentIdComponent 的三元组,然后从这些三元组创建一个新的数据框并使用给定的数据框 merge Node

df = pd.DataFrame([(n,i,c) for i,c in enumerate(Gcc,1) for n in c],columns=['Node','ComponentID','Components'])

data = data.merge(df,on='Node')

或者,您可以使用 map 而不是 merge 来单独创建 ComponentIDComponents

d = dict(enumerate(Gcc,1))
data['ComponentID'] = data['Node'].map({n:i for i,c in d.items() for n in c})
data['Components']  = data['ComponentID'].map(d)

print(data)

   Node  degree  ComponentID    Components
1     1       2            1  {0,1,2,3}
2     2       2            1  {0,3}
5    11       2            2  {10,11,12}
0     0       1            1  {0,3}
3     3       1            1  {0,3}
4    10       1            2  {10,12}
6    12       1            2  {10,12}