基于Pandas的距离计算、按范围过滤及数值汇总问题求助
你已经生成了全量距离矩阵的前提下,用向量化矩阵运算就能直接得到结果,不需要遍历任何列表,代码非常简洁:
实现步骤
- 首先构建ID到数值的映射序列,方便后续匹配求和
# 生成ID与NumberValue的对应关系 value_map = df_latlongs.set_index('IDVALUE')['NumberValue']
- 按你需要的距离区间生成掩码矩阵,符合区间要求的位置标记为1,否则为0
注:你的预期输出里
>100m应该是笔误,这里默认按你描述的三个区间调整为<500m/500-1000m/>1000m,可自行修改阈值
# 三个区间的布尔掩码,距离单位为千米 mask_lt500 = (latlong_df < 0.5).astype(int) mask_500_1000 = ((latlong_df >= 0.5) & (latlong_df < 1)).astype(int) mask_gt1000 = (latlong_df >= 1).astype(int)
- 直接用掩码矩阵和数值序列做点积运算,一步得到每个ID对应区间的总和
# 生成结果表 result_df = pd.DataFrame({ 'IDVALUE': latlong_df.index, '<500m': mask_lt500.dot(value_map), '500-1000m': mask_500_1000.dot(value_map), '>1000m': mask_gt1000.dot(value_map) }).reset_index(drop=True)
- 如果需要关联回原始数据集的经纬度等字段,直接合并即可
final_df = df_latlongs.merge(result_df, on='IDVALUE', how='left')
方案优势
全程无循环、无中间冗余列表生成,完全基于pandas和numpy的向量化运算,哪怕是上万级别的点数据,运算效率也远高于遍历匹配的方案。如果后续需要调整距离区间,只需要修改掩码的阈值即可,无需修改整体逻辑。
内容的提问来源于stack exchange,提问作者Nhyi
相关产品推荐
相关产品推荐

