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

Python中将成对距离长格式DataFrame转换为距离矩阵的方法

Python实现成对距离表转对称距离矩阵

你可以通过以下两种常用方案实现转换,按需选择即可:

方案1:纯Pandas实现(无额外依赖)

通过拼接双向成对数据后直接透视,逻辑直观:

import pandas as pd

# 你的示例数据
df = pd.DataFrame([['sample_1', 'sample_2', 1],
                   ['sample_1', 'sample_3', 4],
                   ['sample_2', 'sample_3', 8]],
                  columns=['SampleA', 'SampleB', 'Num_Differences'])

# 拼接正反双向的成对记录,补齐下三角数据
df_bi = pd.concat([
    df,
    df.rename(columns={'SampleA': 'SampleB', 'SampleB': 'SampleA'})
])

# 透视生成方阵
dist_matrix = df_bi.pivot(
    index='SampleA',
    columns='SampleB',
    values='Num_Differences'
)

# 可选操作:对角线填充为0/空值,匹配你的示例效果
dist_matrix = dist_matrix.fillna(0) # 对角线填0
# dist_matrix = dist_matrix.fillna('') # 对角线留空

print(dist_matrix)

输出结果:

sample_1  sample_2  sample_3
SampleA                               
sample_1       0.0       1.0       4.0
sample_2       1.0       0.0       8.0
sample_3       4.0       8.0       0.0

方案2:使用scipy的squareform方法(专业距离处理工具)

针对距离转换的专用API,代码更简洁,自动处理对称逻辑:

import pandas as pd
from scipy.spatial.distance import squareform

# 你的示例数据
df = pd.DataFrame([['sample_1', 'sample_2', 1],
                   ['sample_1', 'sample_3', 4],
                   ['sample_2', 'sample_3', 8]],
                  columns=['SampleA', 'SampleB', 'Num_Differences'])

# 获取所有唯一样本并排序
samples = sorted(pd.unique(df[['SampleA', 'SampleB']].values.ravel()))
# 按样本顺序提取压缩格式的距离向量
condensed_dist = df.sort_values(by=['SampleA', 'SampleB'])['Num_Differences'].values

# 转换为对称方阵
dist_matrix = pd.DataFrame(
    squareform(condensed_dist),
    index=samples,
    columns=samples
)

print(dist_matrix)

输出和方案1完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:06:01