基于Pandas处理经纬度特征:计算多位置平均距离生成新列
实现方案
1. 整理坐标数据
先从DataFrame里提取出所有纬度(X1-X16)和经度(Y1-Y16)列,转成numpy数组方便后续计算:
lats = df.filter(regex='^X').values # 形状:(数据行数, 16) lons = df.filter(regex='^Y').values # 形状:(数据行数, 16)
2. 用矢量化Haversine生成距离矩阵
利用numpy的广播特性,让每个位置的经纬度和所有位置的经纬度配对,直接调用你的矢量化Haversine函数得到全量距离矩阵:
# 通过广播维度,让单个位置的经纬度与所有位置配对,生成(行数,16,16)的距离矩阵 distance_matrix = haversine(lats[:, :, None], lons[:, :, None], lats[:, None, :], lons[:, None, :])
这里distance_matrix[i,j,k]代表第i行数据里,第j个位置到第k个位置的距离。
3. 计算每个位置的平均距离(A1-A16)
每个位置到自己的距离为0,会拉低均值,所以先把对角线(自身距离)设为NaN,再按每个位置维度求均值:
import numpy as np # 替换对角线值为NaN,排除自身距离的影响 np.fill_diagonal(distance_matrix, np.nan, axis1=1, axis2=2) # 计算每个位置与其余15个位置的平均距离 avg_distances = np.nanmean(distance_matrix, axis=2) # 将结果添加回原DataFrame,列名设为A1到A16 for i in range(16): df[f'A{i+1}'] = avg_distances[:, i]
4. 添加A1-A16的行均值列
直接对A1到A16列求每行的均值,作为新列加入DataFrame:
df['A_mean'] = df.filter(regex='^A').mean(axis=1)
完整可运行代码
如果你的Haversine函数还未实现,这里提供一个兼容的矢量化参考版本:
import numpy as np import pandas as pd # 矢量化Haversine函数(距离单位:公里) def haversine(lat1, lon1, lat2, lon2): R = 6371 # 地球半径 lat1, lon1, lat2, lon2 = map(np.radians, [lat1, lon1, lat2, lon2]) dlat = lat2 - lat1 dlon = lon2 - lon1 a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2 c = 2 * np.arcsin(np.sqrt(a)) return R * c # 处理你的原始DataFrame lats = df.filter(regex='^X').values lons = df.filter(regex='^Y').values # 生成距离矩阵 distance_matrix = haversine(lats[:, :, None], lons[:, :, None], lats[:, None, :], lons[:, None, :]) # 计算每个位置的平均距离 np.fill_diagonal(distance_matrix, np.nan, axis1=1, axis2=2) avg_distances = np.nanmean(distance_matrix, axis=2) # 添加A1-A16列 for idx in range(16): df[f'A{idx+1}'] = avg_distances[:, idx] # 添加均值列 df['A_mean'] = df.filter(regex='^A').mean(axis=1)
内容的提问来源于stack exchange,提问作者Pranav
相关产品推荐
相关产品推荐

