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

计算列间坐标距离遇ValueError错误,求技术支持

问题分析与解决方案

错误原因

你遇到的ValueError: The truth value of a Series is ambiguous...是因为代码存在两个核心问题:

  1. 错误使用整个列而非单行值:distancer函数里的coords_1 = (row_df['lat'], row_df['lng'])取的是整个DataFrame的lat和lng列(Series类型),而geopy.distance.geodesic需要单个坐标对,传入Series会导致内部逻辑触发模糊的真值判断。
  2. 未定义变量与逻辑混乱:变量j没有任何定义,col_coord = row_df.iloc[j,6],row_df.iloc[j,5]完全没有取值依据,同时dist_matrix是空DataFrame,用apply遍历的逻辑不成立。

修正方案

你的目标是计算筛选后(NACE_2dgt=='27')所有坐标两两之间的距离,以下是两种可行的实现方式:

方式1:直观双重循环(适合小数据量)

import pandas as pd
from geopy.distance import geodesic

# 筛选目标数据并确保坐标为数值类型
temp = geo_data[geo_data['NACE_2dgt'] == '27'].copy()
temp['lat'] = pd.to_numeric(temp['lat'])
temp['lng'] = pd.to_numeric(temp['lng'])

# 初始化空的距离矩阵
dist_matrix = pd.DataFrame(index=temp.index, columns=temp.index)

# 遍历所有坐标对计算距离
for i in temp.index:
    coord_i = (temp.loc[i, 'lat'], temp.loc[i, 'lng'])
    for j in temp.index:
        coord_j = (temp.loc[j, 'lat'], temp.loc[j, 'lng'])
        dist_matrix.loc[i, j] = geodesic(coord_i, coord_j).kilometers

# 如果只需要一列距离值(比如上三角/下三角的扁平化结果)
dist_values = dist_matrix.unstack().reset_index(name='distance')

方式2:高效向量计算(适合大数据量)

用scipy的pdist可以避免循环,大幅提升效率:

import pandas as pd
from scipy.spatial.distance import pdist, squareform

# 筛选目标数据并转换为坐标数组
temp = geo_data[geo_data['NACE_2dgt'] == '27'].copy()
temp['lat'] = pd.to_numeric(temp['lat'])
temp['lng'] = pd.to_numeric(temp['lng'])
coords = temp[['lat', 'lng']].values

# 计算两两球面距离(haversine需转弧度,结果乘以地球半径6371得到公里数)
distances = pdist(coords, metric='haversine') * 6371

# 转换为距离矩阵
dist_matrix = pd.DataFrame(squareform(distances), index=temp.index, columns=temp.index)

# 扁平化得到距离值列
dist_values = dist_matrix.unstack().reset_index(name='distance')

关键说明

  • 两种方式最终都能得到你需要的坐标间距离值(dist_values即为扁平化的距离列)。
  • 若数据量极大,优先选择方式2,向量计算的效率远高于循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:18:20