如何将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原生接口,无需手写多层嵌套遍历,比手动列表推导式更稳定:
- 拆分原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"] - 补全对称矩阵的反向配对
原始Series仅存储无序配对的单向值(如仅存A-B未存B-A),直接转宽表会出现位置缺失。通过交换MultiIndex层级生成反向配对值,和原数据拼接后保证矩阵对称:# 交换行、列层级,生成反向配对,和原数据拼接 sym_s = pd.concat([s, s.swaplevel()]) - 转宽表并填充对角线值
# 长表转宽矩阵 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
相关产品推荐
相关产品推荐

