如何删除断开连接的网络中的特定组件

How to remove specific components in a disconnected network

假设我们有以下数据(我的整个数据集的一个样本,有数千行):

Node Target 
1      2
1      3
1      5
2      1
2      3
2      6
7      8 
7      12  
9      13
9      15
9      14

显然,如果我在图表中绘制此数据,我有两个断开连接的组件。 我想知道如何从我的网络中隔离或删除一个组件,例如最小的一个。 我会说首先我应该确定组件,然后 isolate/filtering 找出我不感兴趣的组件。

G = nx.from_pandas_edgelist(df, 'Node', 'Target')

connected_com=[len(c) for c in sorted(nx.connected_components(G), key=len, reverse=True)]

现在我应该只使用来自最大组件的数据创建一个网络:

largest_cc = max(nx.connected_components(G), key=len) 

如果有两个组件,这很容易。但是,如果我想 select 两个组件并排除一个,我应该怎么办?这是我的问题。

在您提供的示例数据中,使用以下代码绘制图表时获得了 3 个岛屿:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import networkx as nx 

df=pd.read_fwf('data.txt')
G = nx.from_pandas_edgelist(df, 'Node', 'Target')
nx.draw(G,with_labels=True)

图表看起来像这样:

现在如果你只想保留最大的两个岛,你可以使用你提到的 nx.connected_components(G) 函数并存储两个最大的组件。下面是执行此操作的代码:

N_subs=2 #Number of biggest islands you want to keep
G_sub=[]
largest_components=[]
for i in range(N_subs):
  largest_components.append(sorted(nx.connected_components(G), key=len, reverse=True)[i])
  G_sub.append(G.subgraph(largest_components[i]))

然后您需要创建一个由两个岛组成的 G 子图。您可以使用 nx.compose_all 来做到这一点。然后你可以绘制你的子图

G_subgraphs=nx.compose_all(G_sub)
nx.draw(G_subgraphs,with_labels=True)

总的来说,代码如下所示:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import networkx as nx 
df=pd.read_fwf('data.txt')
G = nx.from_pandas_edgelist(df, 'Node', 'Target')

N_subs=2
G_sub=[]
largest_components=[]
for i in range(N_subs):
  largest_components.append(sorted(nx.connected_components(G), key=len, reverse=True)[i])
  G_sub.append(G.subgraph(largest_components[i]))

G_subgraphs=nx.compose_all(G_sub)
nx.draw(G_subgraphs,with_labels=True)

此代码的输出为:

注:根据thisnx.connected_components最好用于无向图。由于您正在处理有向图,因此您可能希望改用 strongly_connected_components(G)weakly_connected_components(G)