Python 有向图的最大强连通分量

Python 有向图的最大强连通分量,python,networkx,subgraph,connected-components,Python,Networkx,Subgraph,Connected Components,我正在处理一个Networkx.multi-digraph()对象,该对象由总共82927个定向电子邮件数据构建而成。在当前阶段,我试图从.MultiDiGraph()对象及其相应的子图中获取最大的强连接组件。 可以访问文本数据。 这是我的工作代码: 将networkx导入为nx 作为pd进口熊猫 将matplotlib.pyplot作为plt导入 email_df=pd.read_csv('email_network.txt',分隔符='->') edge#u groups=email#df

我正在处理一个
Networkx
.multi-digraph()
对象,该对象由总共82927个定向电子邮件数据构建而成。在当前阶段,我试图从
.MultiDiGraph()
对象及其相应的子图中获取最大的强连接组件。 可以访问文本数据。 这是我的工作代码:

将networkx导入为nx
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
email_df=pd.read_csv('email_network.txt',分隔符='->')
edge#u groups=email#df.groupby([“#发件人”,“收件人”],as#index=False).count().重命名(列={“时间”:“权重”})
email=nx.来自数据帧(边缘组,#发送方,#接收方,#边缘属性="权重")
G=nx.multi-digraph()
G.add_edges_from(email.edges(data=True))
#G是一个.多有向图对象
#使用.strongly_connected_components()获取G中节点最多的部分
#使用列表理解
_节点数=[len(n)表示已排序的n(nx.强连接的_组件(G))]
节点数
#“number_of_nodes”返回长度为167的[1,1,1,…,1]的列表(这是网络中节点的确切数量)
#使用networkx文档中推荐的方法
最大=最大(nx.强连接组件(G),键=len)
最大的

#“最大”返回{92},不确定这意味着什么错误的根本原因是
nx.from\u pandas\u dataframe
默认创建无向图。因此,
电子邮件
是一个无向图。然后创建有向图时,每条边仅显示在一个方向上

要修复它,请使用参数
create\u using=DiGraph


与您获得的输出相关的旧评论

所有强连接组件都有一个节点

当您执行
max(nx.强连接组件(G),key=len)
时,它会找到长度最长的节点集并返回它。在您的例子中,它们的长度都是1,因此它会返回其中一个(我相信是哪个networkx碰巧放入
nx。强连接的组件(G)
)。但它返回的是布景,不是长度。因此,
{92}
是它返回的节点集

碰巧,
{92}
被选为
nx中的“最长”长度1组件。tiebreaker将强连接组件(G)

例如:

max([{1}, {3}, {5}], key = len)
> {1}
这意味着在图形中基本上没有任何顶点(即,除了孤立的顶点)

如果按长度对这些组件进行排序,则会得到一个单个顶点的randon组件,因为所有组件都具有相同的长度(
1
)。在您的示例中,
{92}
,它可能是任何其他顶点

导入看起来是正确的,实际上没有强连接的组件,这意味着没有人回复任何电子邮件

为了检查问题是否来自
pandas
multi-digraph
或您的导入,我写道:

G = nx.DiGraph()

with open('email_network.txt') as f:
    for line in f:
        n1, n2, time = line.split()
        if n1.isdigit():
            G.add_edge(int(n1),int(n2))
这并没有改变结果

只需使用
G添加一条边。add_edge(2,1)
会创建一个大的强连接组件,不过:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 126, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 115, 117, 118, 119, 120, 121, 122, 123, 124, 128, 129, 134, 149, 151}

当我用
nx.is\u strong\u connected(G)
验证它时,它返回了一个FALSE。但我觉得这没什么意义。@Joel它有3251条边(有些重叠,因此,我添加了一个“权重”属性来解释同一对节点之间的重叠边)。@Eric,我想我真正需要的是一个更好的分组函数(我想我当前的一个可能是错误的)。因为(非常感谢您提出这一点),如果您通过选择
email-df[email-df[#Sender]==2]
的部分条目来检查
email-df
,那么您将看到发件人2实际上多次将电子邮件发回收件人1,因此edge(2,1)实际上存在,但在转换的
网络
对象中丢失。不,我没有修改原始txt文件。@ChrisT。现在我真的很好奇。让我们明天再看。这让我怀疑我是否正确加载和预处理了数据。@ChrisT:你的导入很好。我仔细检查了一遍。我仍然不知道这个结果有什么问题。这看起来很不正常。我想我现在已经添加了对你所看到的内容的解释。非常感谢你解决这个问题,我现在正在阅读你的评论。我发现了错误(我想)。现在将其编辑到我的答案中。。。
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 126, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 115, 117, 118, 119, 120, 121, 122, 123, 124, 128, 129, 134, 149, 151}