Python中如何将含两列ID的长格式DataFrame转为距离矩阵
pandas长表转距离矩阵宽表实现方案
你需要实现的是典型的长格式数据透视为宽格式矩阵的操作,用pandas原生方法即可快速完成,具体步骤如下:
- 导入依赖并构造原始样例数据(若已有现成DataFrame可跳过该步)
import pandas as pd # 完全匹配你给出的原始数据结构 df = pd.DataFrame({ 'id1': ['c1','c1','c1','c1','c2','c2','c2','c2','c3','c3','c3','c3','c4','c4','c4','c4'], 'id2': ['c1','c2','c3','c4','c1','c2','c3','c4','c1','c2','c3','c4','c1','c2','c3','c4'], 'dist': [0,1,5,7,8,0,5,6,3,2,0,4,6,5,4,0] })
- 核心转换代码:直接调用
pivot方法,指定行索引、列名、单元格填充值对应的列即可
dist_matrix = df.pivot(index='id1', columns='id2', values='dist')
执行后得到的dist_matrix完全匹配你给出的目标结构:
| c1 | c2 | c3 | c4 | |
|---|---|---|---|---|
| c1 | 0 | 1 | 5 | 7 |
| c2 | 8 | 0 | 5 | 6 |
| c3 | 3 | 2 | 0 | 4 |
| c4 | 6 | 5 | 4 | 0 |
特殊场景适配
- 如果原始数据中存在重复的
id1+id2组合(即同一对标识对应多条dist记录),直接用pivot会触发报错,此时可替换为pivot_table方法,指定聚合规则即可,例如取同组距离的平均值:
dist_matrix = df.pivot_table( index='id1', columns='id2', values='dist', aggfunc='mean' # 可根据需求替换为sum、min、max等其他聚合函数 )
- 如果需要把行索引
id1转为普通列,和你给出的目标样例第一列的index完全对齐,可以追加一行代码:
dist_matrix = dist_matrix.reset_index(names='index')
内容的提问来源于stack exchange,提问作者alireza
相关产品推荐
相关产品推荐

