如何遍历 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)
我有创建邻接表的函数:
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)