我有一个如下数据框:
X Y
0 1 1
1 1 2
2 2 1
3 2 3
4 3 3
我想在networkx中创建一个无向图,其中数据帧的每一行都对应于该图中的一个节点(每个节点的名称应为数据帧的索引值),并且如果两个节点共享相同的X或Y值。该怎么办?
答案 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)
输出:
答案 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)