邻接列表到矩阵熊猫

问题描述 投票:3回答:3

我试图通过一个从列表中构建邻接矩阵的玩具示例,但我已经无法弄清楚了。我在想.loc()但我不确定如何正确索引。

{'nodes':['A', 'B', 'C', 'D', 'E'],
 'edges':[('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'E'), ('C', 'D'), 
                      ('D', 'E'), ('E', 'A'),('E', 'B'), ('E', 'C')]}

我已经开始构建矩阵:

n = len(graph['nodes'])
adj_matr = pd.DataFrame(0, columns = graph['nodes'], index = graph['edges'])

但现在我不知道如何填写它。我认为有一个简单的一个班轮,也许有列表理解?

预期产量:

   A  B  C  D  E
A  0  1  0  1  0
B  0  0  1  0  1
C  0  0  0  1  0
D  0  0  0  0  1
E  1  1  1  0  0
python pandas dataframe adjacency-matrix adjacency-list
3个回答
2
投票

获得邻接矩阵的一种简单方法是使用NetworkX

d = {'nodes':['A', 'B', 'C', 'D', 'E'],
     'edges':[('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'E'), ('C', 'D'), 
                      ('D', 'E'), ('E', 'A'),('E', 'B'), ('E', 'C')]}

看来,从您的邻接矩阵中可以看到图形。您可以创建如下所示的有向图,并使用以下字典从字典中定义其节点和边:

import networkx as nx
g = nx.DiGraph()
g.add_nodes_from(d['nodes'])
g.add_edges_from(d['edges'])

然后你可以使用nx.adjacency_matrix从网络中获取邻接矩阵:

m = nx.adjacency_matrix(g)
m.todense()

matrix([[0, 1, 0, 1, 0],
        [0, 0, 1, 0, 1],
        [0, 0, 0, 1, 0],
        [0, 0, 0, 0, 1],
        [1, 1, 1, 0, 0]], dtype=int64)

对于具有相应节点作为列的数据帧,您可以执行以下操作:

pd.DataFrame(m.todense(), columns=nx.nodes(g))

   A  B  C  D  E
0  0  1  0  1  0
1  0  0  1  0  1
2  0  0  0  1  0
3  0  0  0  0  1
4  1  1  1  0  0

1
投票

对于无向图

graph = {'nodes': ['A', 'B', 'C', 'D', 'E'],
         'edges': [('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'E'), ('C', 'D'),
                   ('D', 'E'), ('E', 'A'), ('E', 'B'), ('E', 'C')]}
n = len(graph['nodes'])
adj_matr = pd.DataFrame(0, columns=graph['nodes'], index=graph['nodes'])
for i in graph['edges']:
    adj_matr.at[i[0], i[1]] = 1
    adj_matr.at[i[1], i[0]] = 1


print(adj_matr)

   A  B  C  D  E
A  0  1  0  1  1
B  1  0  1  0  1
C  0  1  0  1  1
D  1  0  1  0  1
E  1  1  1  1  0

对于有向图:

graph = {'nodes': ['A', 'B', 'C', 'D', 'E'],
         'edges': [('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'E'), ('C', 'D'),
                   ('D', 'E'), ('E', 'A'), ('E', 'B'), ('E', 'C')]}
n = len(graph['nodes'])
adj_matr = pd.DataFrame(0, columns=graph['nodes'], index=graph['nodes'])
print(adj_matr)
for i in graph['edges']:
    adj_matr.at[i[0], i[1]] = 1
    # adj_matr.at[i[1], i[0]] = 1

print(adj_matr)

   A  B  C  D  E
A  0  1  0  1  0
B  0  0  1  0  1
C  0  0  0  1  0
D  0  0  0  0  1
E  1  1  1  0  0

0
投票

对于有向图,您可以使用:

df = pd.DataFrame(graph['edges'], columns=['From', 'To'])
df['Edge'] = 1
adj = df.pivot(index='From', columns='To', values='Edge').fillna(0)
© www.soinside.com 2019 - 2024. All rights reserved.