gpt4 book ai didi

python - 如何从 Pandas 邻接矩阵数据帧创建有向网络图?

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:36 24 4
gpt4 key购买 nike

我有以下形式的 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 图。我尝试了以下代码变体:

一个)

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

B)

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

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

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

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

例如,

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。

我该如何解决这个问题?

最佳答案

尝试使用 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,您可以使用

label_mapping = {idx: val for idx, val in enumerate(df.columns)}

这似乎是 networkx 2.0 中的错误。他们将在 2.1 中修复它。看这个issue获取更多信息。

关于python - 如何从 Pandas 邻接矩阵数据帧创建有向网络图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48235215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com