You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将pandas Series转换为矩阵并拆分连字符索引为行列名?

场景说明

需要将索引为连字符拼接组合的pandas Series转换为对称邻接矩阵:

  • 矩阵的行名、列名从原索引拆分连字符后的单个字符生成
  • 非对角线位置保留原Series中对应配对的数值
  • 对角线(自配对,如A-A、B-B)固定填充为1

原始数据

输入Series格式:

A-B    10
A-C    20
A-D    30
B-C    40
B-D    50
C-D    60

目标矩阵格式:

A   B   C   D
A   1  10  20  30
B  10   1  40  50
C  20  40   1  60
D  30  50  60   1
最简实现方法

全程使用pandas原生接口,无需手写多层嵌套遍历,比手动列表推导式更稳定:

  1. 拆分原Series的索引为双维度层级
    import pandas as pd
    import numpy as np
    
    # 加载原始示例数据
    s = pd.Series(
        [10,20,30,40,50,60],
        index=["A-B","A-C","A-D","B-C","B-D","C-D"]
    )
    
    # 直接用pandas字符串接口拆分连字符,生成MultiIndex,无需手动嵌套遍历
    s.index = s.index.str.split('-', expand=True)
    s.index.names = ["row", "col"]
    
  2. 补全对称矩阵的反向配对
    原始Series仅存储无序配对的单向值(如仅存A-B未存B-A),直接转宽表会出现位置缺失。通过交换MultiIndex层级生成反向配对值,和原数据拼接后保证矩阵对称:
    # 交换行、列层级,生成反向配对,和原数据拼接
    sym_s = pd.concat([s, s.swaplevel()])
    
  3. 转宽表并填充对角线值
    # 长表转宽矩阵
    matrix = sym_s.unstack()
    # 对角线位置填充固定值1
    np.fill_diagonal(matrix.values, 1)
    

结果验证

运行上述代码的输出和目标格式完全一致:

col   A   B   C   D
row
A     1  10  20  30
B    10   1  40  50
C    20  40   1  60
D    30  50  60   1

对比你之前手写的字符集合提取逻辑:这套方案不需要手动嵌套遍历提取唯一字符,拆分后自动生成的行列索引会自动对齐排序,不会出现手动推导逻辑漏值、错序的问题。


内容的提问来源于stack exchange,提问作者np2020

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 23:54:02