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
相关产品推荐
相关产品推荐

