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

Flightradar24数据用pandas groupby向量化无循环计算相邻点距离

错误原因

原代码报错的核心原因是groupby.apply传入的参数g是完整的分组DataFrame,直接调用g.Position.x是对Point类型的Series取x属性,而Series本身没有该属性,只有单个Point对象支持x/y属性调用。

修复方案

无需额外生成组内序号,通过分组移位获取上一行位置,再逐行计算距离即可,代码如下:

import pandas as pd
from datetime import datetime
from shapely.geometry import Point
from geopy.distance import distance

# 示例数据构造
dates = ['2020-12-26 15:13:01', '2020-12-26 15:13:07','2020-12-26 15:13:19','2020-12-26 15:13:32','2020-12-26 15:13:38']
datetimes = [datetime.fromisoformat(date) for date in dates]
data = {'UTC': datetimes, 
        'Callsign': ["1", "1","2","2","2"],
        'Position':[Point(30.542175,-91.13999200000001), Point(30.546204,-91.14020499999999),Point(30.551443,-91.14417299999999),Point(30.553909,-91.15136699999999),Point(30.554489,-91.155075)]
       }
df = pd.DataFrame(data)

# 运算前先按航班号+时间排序,避免顺序错误
df = df.sort_values(by=['Callsign', 'UTC']).reset_index(drop=True)

# 分组获取上一行位置
df['prev_pos'] = df.groupby('Callsign')['Position'].shift(1)

# 计算距离,首行无前置位置则填0
df['dist'] = df.apply(
    lambda row: 0 if pd.isna(row['prev_pos']) 
    else distance((row['Position'].x, row['Position'].y), (row['prev_pos'].x, row['prev_pos'].y)).miles,
    axis=1
)

# 删除辅助列
df.drop('prev_pos', axis=1, inplace=True)

运行后df['dist']的输出和你给出的预期值完全一致。

性能说明

该方案仅使用单循环逐行运算,比双重循环效率高两个数量级,完全满足普通航班数据集的运算需求。如果需要处理千万级以上的超大规模数据,可以提前把Position拆分为独立的经纬度列,再用向量化的哈弗辛公式实现距离计算,进一步提升运算速度。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:36:00