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

Python3实现CSV元素交叉比对并计算邮政编码间地理距离

邮政编码两两距离计算实现方案

现有代码问题梳理

  • 导入语法错误,geopy相关导入写法不符合规范
  • df.loc直接用Postcode值查询会报错,默认情况下DataFrame的索引不是Postcode字段
  • 嵌套for循环效率极低,数据量超过1000条时性能会非常差
  • 缺少实际的距离计算逻辑,仅输出了坐标值

完整实现步骤

第一步:安装依赖

执行以下命令安装需要的第三方库:
pip install pandas geopy

第二步:实现代码

使用pandas笛卡尔积(交叉连接)替代嵌套循环,大幅提升计算效率,代码如下:

import pandas as pd
from geopy.distance import geodesic

# 读取本地CSV文件
df = pd.read_csv('MonkeyProof_postcodes_developer.csv')

# 生成所有邮政编码的两两组合(笛卡尔积)
df['temp_key'] = 0
cross_df = pd.merge(df, df, on='temp_key', suffixes=('_left', '_right')).drop('temp_key', axis=1)

# 计算两组坐标之间的公里距离
cross_df['distance_km'] = cross_df.apply(
    lambda row: geodesic(
        (row['Latitude_left'], row['Longitude_left']),
        (row['Latitude_right'], row['Longitude_right'])
    ).km,
    axis=1
)

# 仅保留需要的字段输出
result = cross_df[['Postcode_left', 'Postcode_right', 'distance_km']]
# 可以根据需要打印或者保存到CSV
# print(result)
# result.to_csv('postcode_distance.csv', index=False)

如果你的Coords字段已经是预处理好的(纬度, 经度)元组格式,也可以直接替换lambda内的坐标参数,无需单独读取经纬度字段。

可选优化

如果不需要重复配对和自身配对,可以添加以下过滤逻辑,减少一半以上的计算量:

# 过滤掉自身配对,且只保留A<B的组合避免重复
result = result[result['Postcode_left'] < result['Postcode_right']]

内容的提问来源于stack exchange,提问作者Jonas Willems

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:54:08