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

