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

Mel*_*uce 5 python numpy networkx pandas

我有一个以下形式的 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
Run Code Online (Sandbox Code Playgroud)

我正在尝试由此创建一个 networkx 图。我尝试过以下代码变体:

A)

G=networkx.from_pandas_adjacency(df)
G=networkx.DiGraph(G) 
Run Code Online (Sandbox Code Playgroud)

二)

G=networkx.from_pandas_adjacency(df, create_using=networkx.DiGraph())
Run Code Online (Sandbox Code Playgroud)

然而,最终发生的情况是图形对象:

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

(对于选项 B)将任意两个给定节点之间的两条平行边中的值之一作为两条边的值

例如,

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

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

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

我该如何解决这个问题?

Tai*_*Tai 4

尝试使用 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})])
Run Code Online (Sandbox Code Playgroud)

在更一般的情况下,为了让label_mapping你可以使用

label_mapping = {idx: val for idx, val in enumerate(df.columns)}
Run Code Online (Sandbox Code Playgroud)

这似乎是 中的一个错误networkx 2.0。他们将在 2.1 中修复它。请参阅此问题以获取更多信息。