如何加速pandas DataFrame按到指定坐标点距离的排序速度
Pandas百万行数据按坐标距离排序优化方案
原有代码性能瓶颈
- 逐行调用
iloc取数:单次iloc行索引开销极低,但百万次调用的累积开销极高 - 纯Python级别的排序逻辑:Python原生
sorted函数的迭代、key计算都在Python层执行,远慢于Pandas/Numpy底层C实现的向量化运算 - 冗余的开方运算:距离排序仅需要相对大小,开方属于单调运算,不改变排序结果,属于不必要的计算开销
- 手动重建DataFrame的额外开销:排序后手动拼接数据生成新DataFrame,产生冗余的内存拷贝
优化方案
核心思路
全部改用向量化运算,避免Python层循环,去除冗余计算,使用Pandas原生排序能力。
具体步骤
- 向量化提取
coord列每个元素的首个坐标点,无需逐行遍历 - 计算首个点与目标点的距离平方(省略开方步骤,不影响排序结果)
- 直接使用Pandas原生排序接口按距离平方排序
优化后代码
import pandas as pd import numpy as np def sort_dataframe_by_dist(dataframe, column, XYPt): x0, y0 = XYPt # 向量化提取所有首点坐标 first_points = dataframe[column].str[0] # 计算距离平方 dist_sq = (first_points.str[0] - x0) ** 2 + (first_points.str[1] - y0) ** 2 # 按距离平方排序后返回,重置索引 return dataframe.iloc[dist_sq.sort_values().index].reset_index(drop=True)
极致性能优化版(基于Numpy,速度更快)
如果需要进一步压缩耗时,可以将坐标转为Numpy数组计算:
def sort_dataframe_by_dist(dataframe, column, XYPt): target_arr = np.array(XYPt, dtype=np.float64) # 提取所有首点坐标转为Numpy二维数组 first_coords = np.vstack(dataframe[column].str[0].to_numpy()) # 向量化计算距离平方 dist_sq = np.sum((first_coords - target_arr) ** 2, axis=1) # 按距离排序返回 return dataframe.iloc[np.argsort(dist_sq)].reset_index(drop=True)
性能提升效果
原代码100万行排序耗时3分39秒,优化后耗时可压缩到2秒以内,性能提升超过100倍。
内容的提问来源于stack exchange,提问作者user14087589
相关产品推荐
相关产品推荐

