如何用更高效/Pythonic方法计算Pandas DataFrame每行与其他行的最大距离?
用向量化操作替代嵌套循环,大幅提升计算效率
你的嵌套循环实现虽然直观,但iterrows()遍历效率极低,且时间复杂度为O(n²),当数据量较大时速度会严重下降。以下是两种更高效、更符合Python/Pandas风格的实现方式:
方法一:利用Numpy广播计算距离矩阵
通过Numpy的广播机制一次性生成所有行对的欧氏距离,避免显式循环:
import numpy as np import pandas as pd # 提取X、Y列的数值数组 coords = df[['X', 'Y']].values # 生成所有行对的坐标差值(形状为(n, n, 2)) diff = coords[:, np.newaxis, :] - coords[np.newaxis, :, :] # 计算欧氏距离矩阵 dist_matrix = np.sqrt(np.sum(diff ** 2, axis=2)) # 对每行取最大距离,添加为新列 df['max_dist'] = dist_matrix.max(axis=1)
方法二:使用Scipy的distance_matrix(更简洁高效)
Scipy提供了优化过的距离计算函数,底层基于C实现,速度更快:
from scipy.spatial import distance_matrix import pandas as pd coords = df[['X', 'Y']].values # 直接生成所有点对的欧氏距离矩阵 dist_matrix = distance_matrix(coords, coords) # 提取每行的最大值 df['max_dist'] = dist_matrix.max(axis=1)
原代码的注意点
- 原代码中
df.loc['max_dist'][i_df]属于链式索引,可能触发SettingWithCopyWarning,正确的赋值方式应为df.loc[i_df, 'max_dist'] - 嵌套
iterrows()的遍历方式在数据量超过几百行后会变得非常缓慢,向量化操作能将计算效率提升数倍甚至数十倍
内容的提问来源于stack exchange,提问作者statHacker
相关产品推荐
相关产品推荐

