优化Pandas DataFrame中坐标聚类的嵌套循环以提升处理速度
问题解决方案
一、移除嵌套循环,优化距离计算与聚类
实现思路
放弃嵌套循环,利用Pandas/Numpy的向量化广播机制批量计算所有Locations与Pokestops的坐标距离,再筛选符合70米(0.07千米)条件的记录,最后聚合回Locations的列表格式。这种方法依托底层C实现的运算逻辑,能彻底规避Python循环的性能开销,中小数据集的处理速度会有数量级的提升。
代码示例
假设两个DataFrame的坐标列为lat(纬度)和lon(经度):
import pandas as pd from geopy.distance import geodesic import numpy as np # 提取坐标数组,用于广播运算 loc_coords = Locations[['lat', 'lon']].to_numpy() poke_coords = Pokestops[['lat', 'lon']].to_numpy() # 生成全量距离矩阵(单位:千米),shape为(len(Locations), len(Pokestops)) distance_matrix = np.array([[geodesic(loc, poke).km for poke in poke_coords] for loc in loc_coords]) # 筛选出距离≤0.07千米的坐标对索引 valid_pairs = np.where(distance_matrix <= 0.07) # 构造匹配关系表,聚合每个Location对应的Pokestops索引(可替换为Pokestops的标识列) matches = pd.DataFrame({ 'loc_index': valid_pairs[0], 'poke_index': valid_pairs[1] }) Locations['Pokestops'] = matches.groupby('loc_index')['poke_index'].agg(list).reindex(Locations.index, fill_value=[])
速度提升说明
向量化运算跳过了Python循环的逐次调用开销,百万级的循环量可以压缩到毫秒级完成,数据集越大,性能优势越明显。
二、删除距离矩阵中第一行非NaN的列
你之前用dropna()失败是因为它默认删除含NaN的行/列,而你需要删除的是不含NaN的列,正确做法是先定位目标列再删除:
若距离矩阵为DataFrame格式:
# 定位第一行非NaN的列 cols_to_drop = distance_matrix.columns[distance_matrix.iloc[0].notna()] # 删除目标列 distance_matrix_cleaned = distance_matrix.drop(columns=cols_to_drop)
若距离矩阵为Numpy数组格式:
# 定位第一行非NaN的列索引 cols_to_drop = np.where(~np.isnan(distance_matrix[0]))[0] # 删除目标列 distance_matrix_cleaned = np.delete(distance_matrix, cols_to_drop, axis=1)
内容的提问来源于stack exchange,提问作者Jebula999
相关产品推荐
相关产品推荐

