如何用Pythonic方法将节点距离矩阵CSV转换为三列节点距离长表
节点距离矩阵宽转长的Python实现
用pandas向量化操作即可完成,不需要手动写嵌套循环遍历单元格,是适配这个场景最简洁的Pythonic方案,全流程没有多余处理步骤:
1. 环境准备
如果还没安装pandas,先执行安装:
pip install pandas
2. 核心转换代码
代码完全匹配你描述的文件结构:左上角为空白单元格、首行存储列向节点ID、第一列存储行向节点ID、交叉单元格存储两节点的距离值,转换后会覆盖所有单元格的记录,不会遗漏:
import pandas as pd # 读取CSV:将第一列设为行索引,自动适配左上角无表头的矩阵结构 dist_matrix = pd.read_csv("你的距离矩阵文件路径.csv", index_col=0) # 宽表转长表,生成三列结构 long_table = ( dist_matrix # 堆叠列维度:把每个列名和行索引配对成独立的记录行 .stack() # 将多级索引重置为普通列,方便后续重命名 .reset_index() # 按需求命名列,得到Node1、Node2、Distance三列 .rename(columns={ "level_0": "Node1", # 原行索引对应的节点 "level_1": "Node2", # 原列名对应的节点 0: "Distance" # 交叉单元格的距离值 }) ) # 导出为CSV文件,不携带额外的自增索引列 long_table.to_csv("转换后的节点距离长表.csv", index=False)
3. 可选过滤逻辑
根据你提到的规则:单元格值为0时,要么是同节点的自身距离,要么是两节点无连通关系。如果需要剔除无效的无连接记录(即两个不同节点之间距离为0的条目),可以在导出前追加过滤代码:
# 过滤后仅保留:同节点的0值(自身距离)、不同节点的有效连接(非0距离) long_table = long_table[ ~((long_table["Node1"] != long_table["Node2"]) & (long_table["Distance"] == 0)) ]
方案特点
- 处理效率高:面对8000+节点的矩阵(全量转换约6400万条记录),pandas向量化操作的处理速度远快于原生Python写的嵌套循环
- 适配性强:不需要手动对齐行列节点顺序、不需要专门处理左上角的空白单元格结构,仅靠
index_col=0参数就能适配常规导出的距离矩阵格式 - 结果完全匹配要求:生成的长表结构和你给出的示例完全一致,覆盖所有节点对的连接关系
内容的提问来源于stack exchange,提问作者RevolverOshawott
相关产品推荐
相关产品推荐

