You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:18:24