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

如何将Pandas单列坐标转换为全站点两两距离矩阵

实现站点距离矩阵的方法

你可以通过以下两种方式实现需求,最终输出格式完全符合你的预期:


方法1:使用geopy库计算(球面距离精度更高)

首先安装依赖:

pip install geopy

完整代码如下:

import pandas as pd
from geopy.distance import geodesic

# 你的原始DataFrame
df = pd.DataFrame({
    "site" : [1,2,3,4,5], 
    "coordiantes":[(35.786827, -77.884923),(35.643, -77.3165),(35.669927, -77.385737),(36.0096, -77.8117),(34.971758, -80.387936)]
})

# 生成站点名称列表、坐标列表
site_names = [f"Site{i}" for i in df["site"]]
coords = df["coordiantes"].tolist()
site_count = len(site_names)

# 初始化距离矩阵
dist_matrix = [[0.0]*site_count for _ in range(site_count)]
# 两两计算距离,单位默认公里,可根据需要调整为英里:用.miles替换.km
for i in range(site_count):
    for j in range(site_count):
        dist_matrix[i][j] = round(geodesic(coords[i], coords[j]).km, 1)

# 转成目标格式DataFrame
dist_df = pd.DataFrame(dist_matrix, index=site_names, columns=site_names)
# 新增Site列作为首列,匹配你的预期输出结构
dist_df = dist_df.reset_index(names="Site")

方法2:原生Python实现(无需额外安装依赖)

用Haversine公式手动实现球面距离计算,不需要安装第三方库,代码如下:

import pandas as pd
import math

# Haversine公式计算两点经纬度距离,返回单位为公里
def calc_distance(coord1, coord2):
    lat1, lon1 = coord1
    lat2, lon2 = coord2
    # 十进制度转弧度
    lat1, lon1, lat2, lon2 = map(math.radians, [lat1, lon1, lat2, lon2])
    # 差值计算
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
    c = 2 * math.asin(math.sqrt(a))
    # 地球平均半径6371公里,需要英里的话替换为3956
    return round(c * 6371, 1)

# 你的原始DataFrame
df = pd.DataFrame({
    "site" : [1,2,3,4,5], 
    "coordiantes":[(35.786827, -77.884923),(35.643, -77.3165),(35.669927, -77.385737),(36.0096, -77.8117),(34.971758, -80.387936)]
})

# 后续生成矩阵逻辑和方法1完全一致
site_names = [f"Site{i}" for i in df["site"]]
coords = df["coordiantes"].tolist()
site_count = len(site_names)
dist_matrix = [[0.0]*site_count for _ in range(site_count)]
for i in range(site_count):
    for j in range(site_count):
        dist_matrix[i][j] = calc_distance(coords[i], coords[j])
dist_df = pd.DataFrame(dist_matrix, index=site_names, columns=site_names).reset_index(names="Site")

输出的dist_df就是你需要的结构,对角线值为0,可根据需要调整保留的小数位数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:27:03