如何在Pandas DataFrame中计算任意两行间的平方距离?
计算DataFrame中任意行的平方距离的简便方法
这里有两种高效的实现方式,直接用Python的数据分析工具就能搞定:
方法一:用scipy的距离计算工具
scipy库提供了专门的距离计算函数,能快速生成两两行的平方距离矩阵:
- 先导入库并构造示例DataFrame:
import pandas as pd from scipy.spatial.distance import pdist, squareform data = { 'Writer': [1, 2, 3], 'A': [0.2, 0.1, 0.5], 'B': [0.4, 1.2, 0.2], 'C': [0.6, 0.3, 0.8] } df = pd.DataFrame(data).set_index('Writer')
- 计算平方距离并生成矩阵:
# 计算所有行对的平方欧氏距离 sq_distances = pdist(df.values, metric='sqeuclidean') # 转换为对称方阵,行和列对应Writer编号 sq_dist_matrix = squareform(sq_distances) # 转为带索引的DataFrame,方便查看 result_df = pd.DataFrame(sq_dist_matrix, index=df.index, columns=df.index)
运行后得到的结果:
Writer 1 2 3 Writer 1 0.00 0.74 0.24 2 0.74 0.00 1.14 3 0.24 1.14 0.00
方法二:用pandas的广播机制(无需额外库)
如果不想导入scipy,直接用numpy的广播特性也能实现:
import pandas as pd data = { 'Writer': [1, 2, 3], 'A': [0.2, 0.1, 0.5], 'B': [0.4, 1.2, 0.2], 'C': [0.6, 0.3, 0.8] } df = pd.DataFrame(data).set_index('Writer') # 提取数值矩阵,通过广播计算两两差的平方和 values = df.values sq_dist_matrix = ((values[:, None] - values)**2).sum(axis=2) result_df = pd.DataFrame(sq_dist_matrix, index=df.index, columns=df.index)
这个方法的原理是把数值矩阵变形后做减法,对每个元素平方再求和,最终得到和方法一完全一致的结果。
内容的提问来源于stack exchange,提问作者gal leshem
相关产品推荐
相关产品推荐

