如何从pandas邻接矩阵数据帧创建有向networkx图?

2024-03-29 06:59:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据帧,格式如下,df

    A    B    C    D
A   0   0.5   0.5  0 
B   1    0    0    0
C   0.8  0    0   0.2
D   0    0    1    0

我正试图从中创建一个networkx图形。我尝试过以下代码变体:

(一)

^{pr2}$

(二)

G=networkx.from_pandas_adjacency(df, create_using=networkx.DiGraph())

但是,最终发生的是图形对象:

(对于选项A)基本上只取任意两个给定节点之间的两条平行边中的一个值,删除另一条。在

对于给定的两个边之间的值,。在

例如

print( list ( filter ( lambda x: x[0]=='A' and x[1] == 'B', list(G.edges.data()) ) ) )

以及

print( list ( filter ( lambda x: x[0]=='B' and x[1] == 'A', list(G.edges.data()) ) ) )

打印选项A的1和[]。 为选项B打印两个1

我如何解决这个问题?在


Tags: and数据lambdanetworkx图形pandasdfdata
1条回答
网友
1楼 · 发布于 2024-03-29 06:59:29

尝试使用numpy作为解决方法。在

G = nx.from_numpy_matrix(df.values, parallel_edges=True, 
                         create_using=nx.MultiDiGraph())

# Because we use numpy, labels need to be reset
label_mapping = {0: "A", 1: "B", 2: "C", 3: "D"}
G = nx.relabel_nodes(G, label_mapping)

G.edges(data=True)

OutMultiEdgeDataView([('A', 'B', {'weight': 0.5}), 
                      ('A', 'C', {'weight': 0.5}), 
                      ('B', 'A', {'weight': 1.0}), 
                      ('C', 'A', {'weight': 0.8}), 
                      ('C', 'D', {'weight': 0.2}), 
                      ('D', 'C', {'weight': 1.0})])

在更一般的情况下,要获得label_mapping,可以使用

^{pr2}$

这似乎是networkx 2.0中的一个错误。他们将在2.1中修复它。有关详细信息,请参阅此issue。在

相关问题 更多 >