我有一个如下所示的数据框:
X Y
0 1 1
1 1 2
2 2 1
3 2 3
4 3 3
我想在Networkx中创建一个无向图,其中数据框的每一行对应于图中的一个节点(每个节点的名称应为数据框的索引值),如果两个节点共享相同的X或Y值,则在它们之间绘制一个边缘。如何实现这一操作?
您可以使用itertools.combinations
,通过定义所有节点对来定义您的边,这些节点对在'X'
和'Y'
上具有相同的值。
import itertools.combinations as comb
edges = set()
for col in df:
for _, data in df.groupby(col):
edges.update(comb(data.index, 2))
G = nx.Graph()
G.add_nodes_from(df.index)
G.add_edges_from(edges)
如果我理解得正确:
您的索引是节点的标签。因此,我们需要对数据框进行一些重塑,以创建边缘列表数据框:
d1 = df.reset_index().set_index(['X',df.groupby('X').cumcount()]).unstack()['index']
d2 = df.reset_index().set_index(['Y',df.groupby('Y').cumcount()]).unstack()['index']
d3 = pd.concat([d1,d2]).set_axis(['source','target'], inplace=False, axis=1).dropna().astype(int)
G = nx.from_pandas_edgelist(d3, source='source', target='target')
nx.draw_networkx(G)
输出:
nx.Graph().add_edges_from(df.values)
- yatu