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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:30:56