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
相关产品推荐
相关产品推荐

