如何从DataFrame创建networkx图,其中边基于DataFrame中另一列的布尔切片



假设我有一个DataFrame:

Col1    Col2
0   Bob     6
1   Bob     5
2   Bob     17
3   Joe     54
4   Frank   12
5   Joe     9
6   Frank   707
7   Frank   24
8   Frank   76

我想创建一个Networkx图,使节点基于Col2,边基于Col1。换句话说,如果这个DataFrame被转换为源和目标列表,它们将是:

source = [5, 5, 6, 9, 12, 12, 12, 707, 707, 24]
target = [6, 17, 17, 54, 707, 24, 76, 24, 76, 76]

所有的'Bob'项目都被分组在一起,所以在5、6和17之间有边,等等。

有办法做到这一点吗?我绞尽脑汁,什么都没想出来。

您可以将groupbyitertools.combinations一起使用

from itertools import combinations
import networkx as nx
edges = (df
.groupby('Col1')['Col2']
.agg(lambda x: list(combinations(x, r=2)))
.explode()
)
G = nx.from_edgelist(edges)
G.edges()

输出:

EdgeView([(6, 5), (6, 17), (5, 17), (12, 707), (12, 24), (12, 76), (707, 24), (707, 76), (24, 76), (54, 9)])

相关内容

最新更新