计算列间坐标距离遇ValueError错误,求技术支持
问题分析与解决方案
错误原因
你遇到的ValueError: The truth value of a Series is ambiguous...是因为代码存在两个核心问题:
- 错误使用整个列而非单行值:
distancer函数里的coords_1 = (row_df['lat'], row_df['lng'])取的是整个DataFrame的lat和lng列(Series类型),而geopy.distance.geodesic需要单个坐标对,传入Series会导致内部逻辑触发模糊的真值判断。 - 未定义变量与逻辑混乱:变量
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
相关产品推荐
相关产品推荐

