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。
我该如何解决这个问题?
尝试使用 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 中修复它。请参阅此问题以获取更多信息。