for index, row in df.iterrows(): from_node_id = row['From Node ID'] to_node_id = row['To Node ID'] coords = row['Coordinates'] from_coord = coords[0] to_coord = coords[-1] result = result.append({'Node ID': from_node_id, 'latitude': from_coord[1], 'longitude': from_coord[0]}, ignore_index=True) result = result.append({'Node ID': to_node_id, 'latitude': to_coord[1], 'longitude': to_coord[0]}, ignore_index=True)
时间: 2023-06-12 07:06:26 浏览: 138
这段代码是一个使用 Pandas 库中 DataFrame 的迭代器 iterrows() 迭代行的例子。它会遍历 DataFrame 中的每一行,然后从每一行中取出三个值:起始节点 ID、终止节点 ID 和坐标。然后将起始节点和终止节点的经度和纬度存入一个新的 DataFrame 中(result)。
在这个例子中,coords 变量是一个由起始坐标和终止坐标组成的列表。所以 from_coord 就是 coords 列表中的第一个元素,即起始坐标;to_coord 就是 coords 列表中的最后一个元素,即终止坐标。
在将结果存入 result DataFrame 中时,使用了 append() 方法。它会将新的行添加到 DataFrame 的末尾,并返回结果。ignore_index=True 参数表示在添加新行时忽略原 DataFrame 的索引,使用默认索引。
相关问题
result = pd.DataFrame(columns=['Node ID', 'latitude', 'longitude']) for index, row in df.iterrows(): from_node_id = row['From Node ID'] to_node_id = row['To Node ID'] coords = row['Coordinates'] from_coord = coords[0] to_coord = coords[-1] result = result.append({'Node ID': from_node_id, 'latitude': from_coord[1], 'longitude': from_coord[0]}, ignore_index=True) result = result.append({'Node ID': to_node_id, 'latitude': to_coord[1], 'longitude': to_coord[0]}, ignore_index=True)
这代码的作用是将一个包含道路节点及其坐标信息的数据框(DataFrame)转换成一个新的数据框,其中每一行包含一个节点的ID、纬度和经度。具体来说,代码首先创建了一个名为`result`的空数据框,其中包含三列:`Node ID`表示节点ID,`latitude`表示节点的纬度,`longitude`表示节点的经度。然后,对于每一行数据,代码从中提取出该行的起点节点ID、终点节点ID和坐标信息。接着,代码将起点节点的ID、纬度和经度添加到`result`数据框中的一行,将终点节点的ID、纬度和经度添加到`result`数据框中的另一行。最后,代码返回转换后的数据框`result`。
import pandas as pd import numpy as np import networkx as nx import matplotlib.pyplot as plt df = pd.read_excel(r"C:\Users\li'yi'jie\Desktop\运筹学网络规划数据.xlsx") edges = [] for i in range(len(df)): edge = { "id": df.loc[i, "边的编号"], "tail": df.loc[i, "边的尾节点"], "head": df.loc[i, "边的头节点"], "length": df.loc[i, "长度"], "capacity": df.loc[i, "容量"] } edges.append(edge) plt.figure(figsize=(15,15)) G = nx.DiGraph() for edge in edges: G.add_edge(edge["tail"], edge["head"], weight=edge["length"]) pos = nx.spring_layout(G) nx.draw(G, pos, with_labels=True) labels = nx.get_edge_attributes(G, "weight") nx.draw_networkx_edge_labels(G, pos, edge_labels=labels) #nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, label_pos=0.3) plt.show() all_pairs = dict(nx.all_pairs_dijkstra_path_length(G)) rows = [] for start_node, dist_dict in all_pairs.items(): for end_node, dist in dist_dict.items(): rows.append({'起始节点': start_node, '终止节点': end_node, '最短路径长度': dist}) df_result = pd.DataFrame(rows) df_result.to_excel('all_pairs.xlsx', index=False)请问在写入excel的时候,能否把经过的边的编号一起写入呢?麻烦给下修改后的代码,谢谢你!
可以在遍历最短路径的时候记录下经过的边的编号,然后将其存储到结果表格中。以下是修改后的代码:
```
import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
df = pd.read_excel(r"C:\Users\li'yi'jie\Desktop\运筹学网络规划数据.xlsx")
edges = []
for i in range(len(df)):
edge = {
"id": df.loc[i, "边的编号"],
"tail": df.loc[i, "边的尾节点"],
"head": df.loc[i, "边的头节点"],
"length": df.loc[i, "长度"],
"capacity": df.loc[i, "容量"]
}
edges.append(edge)
plt.figure(figsize=(15,15))
G = nx.DiGraph()
for edge in edges:
G.add_edge(edge["tail"], edge["head"], weight=edge["length"])
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True)
labels = nx.get_edge_attributes(G, "weight")
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)
#plt.draw()
plt.show()
all_pairs = dict(nx.all_pairs_dijkstra_path(G))
rows = []
for start_node, paths in all_pairs.items():
for end_node, path in paths.items():
path_edges = []
for i in range(len(path)-1):
edge_id = G[path[i]][path[i+1]]['id']
path_edges.append(edge_id)
row = {
'起始节点': start_node,
'终止节点': end_node,
'最短路径长度': nx.dijkstra_path_length(G, start_node, end_node),
'经过的边编号': path_edges
}
rows.append(row)
df_result = pd.DataFrame(rows)
df_result.to_excel('all_pairs.xlsx', index=False)
```
修改后的代码中,我们在遍历最短路径时,记录下了经过的边的编号,并将其存储到结果表格的“经过的边编号”一列中。
阅读全文