将熊猫数据框转换为networkx图

时间:2018-12-26 21:17:17

标签: python pandas networkx

我有一个如下数据框:

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

我想在networkx中创建一个无向图,其中数据帧的每一行都对应于该图中的一个节点(每个节点的名称应为数据帧的索引值),并且如果两个节点共享相同的X或Y值。该怎么办?

2 个答案:

答案 0 :(得分:1)

IIUC:

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

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 :(得分:1)

您可以使用'X'通过定义'Y'具有相同值和itertools.combinations具有相同值的所有节点对来定义边。

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)