You need to enable JavaScript to run this app. 如何用Pythonic方法将节点距离矩阵CSV转换为三列节点距离长表
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 07:06:07