如何遍历 pandas 数据框来创建邻接表?

How do I loop over pandas Data frame to create adjacency list?

我有创建邻接表的函数:

adj_list = {}
list1 = []
  
def add_node(node):
  if node not in list1:
    list1.append(node)
  else:
    print(f'Node {node} already added')

def add_edge(node, target,weight):
  temp= []
  if node in list1 and target in list1:
    temp.append(target,weight)
    adj_list[node] = temp

  elif node in adj_list:
    temp.extend(adj_list[node])
    temp.append(target,weight)
    adj_list[node] = temp 
  else:
    print('Node does not exit') 

但我只能像这样手动添加节点和边:

add_node(0)
add_node(1)

add_edge(0,1,2)
add_edge(1,2,2)

但是我有一个比较大的图,我不能全部手工添加,所以我把示例图数据放在一个数据框中:

node target weight
0 1 2
1 2 2
2 3 4
3 0 5
3 4 3
4 0 1

循环 df['node'] 有效:

for i in df['node']:
  add_node(i)

但我找不到对 add_edges

执行相同操作的方法

所以我要构建的是一个接受数据框和 returns 图表的函数,如下所示:

# graph
0  --->  [[1, 2]]
1  --->  [[2, 2]]
2  --->  [[3, 4]]
3  --->  [[0, 5], [4, 3]]
4  --->  [[0, 1]]

# adj_list
{0: [[1, 2]], 1: [[2, 2]], 2: [[3, 4]], 3: [[0, 5], [4, 3]], 4: [[0, 1]]}

此外,我知道像 networkx 这样的库,但我需要从头开始实现它。

您可以轻松地为 add_edge 执行相同的操作,方法是使用 iterrows:

遍历数据帧的每一行
for idx, row in df.iterrows():
    add_edge(row.node, row.target, row.weight)