【问题标题】:How do I loop over pandas Data frame to create adjacency list?如何遍历熊猫数据框以创建邻接列表?
【发布时间】:2022-01-16 09:30:17
【问题描述】:

我有创建邻接列表的函数:

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 执行相同操作的方法

所以我要构建的是一个函数,它接受一个数据框并返回一个图形,如下所示:

# 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 之类的库,但我需要从头开始实现它。

【问题讨论】:

    标签: python pandas nodes graph-algorithm


    【解决方案1】:

    您可以轻松地对 add_edge 执行相同的操作,方法是使用 iterrows 循环遍历数据帧的每一行:

    for idx, row in df.iterrows():
        add_edge(row.node, row.target, row.weight)
    

    【讨论】:

      猜你喜欢
      • 2017-06-08
      • 1970-01-01
      • 2021-11-09
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 2021-06-08
      相关资源
      最近更新 更多