将pandas数据框转换为networkx图

4

我有一个如下所示的数据框:

    X  Y
0   1  1
1   1  2
2   2  1
3   2  3
4   3  3

我想在Networkx中创建一个无向图,其中数据框的每一行对应于图中的一个节点(每个节点的名称应为数据框的索引值),如果两个节点共享相同的X或Y值,则在它们之间绘制一个边缘。如何实现这一操作?


你想如何为这些节点标记? - Scott Boston
你的意思是每一行代表一条边,对吗? - yatu
G = nx.from_pandas_edgelist(df, 'X', 'Y') 然后只需绘制即可。 - BENY
1
或者 nx.Graph().add_edges_from(df.values) - yatu
@yatu 运行正常 - Mohammad Heydari
2个回答

3

您可以使用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)

太棒了!这也非常快速! - Rushabh Mehta

1

如果我理解得正确:

您的索引是节点的标签。因此,我们需要对数据框进行一些重塑,以创建边缘列表数据框:

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)

输出:

enter image description here


1
太棒了!这真是太酷了。我尝试使用reset_index,但是无法弄清楚它的用法。 - Rushabh Mehta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接