假设我有一个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之间有边,等等。
有办法做到这一点吗?我绞尽脑汁,什么都没想出来。
您可以将groupby
与itertools.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)])