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

如何在Pandas中按分组计算行间差值(道路标记距离场景)

嘿,这个问题我熟!之前我也帮别人解决过类似的分组计算距离的需求,不用循环完全可以搞定~

解决思路:用Pandas分组后一次性应用多函数

核心就是利用groupby结合apply或agg,把需要的两个计算逻辑打包,不用手动循环每个道路分组,从根源避免跨道路计算的错误。

场景1:给每个标记点计算相邻路段距离+累计距离

假设你的数据是类似这样的结构(包含道路标识、标记点、里程/坐标):

import pandas as pd

# 示例数据
df = pd.DataFrame({
    'road': ['A', 'A', 'A', 'B', 'B', 'B'],
    'marker_id': [1, 2, 3, 1, 2, 3],
    'mileage': [0, 450, 1200, 0, 600, 1500]  # 也可以替换成lat/lon地理坐标
})

步骤1:写一个自定义处理函数

把你需要的两个计算逻辑(比如相邻路段距离、累计距离)放到一个函数里,这个函数会接收每个道路的分组数据:

def process_road_group(group):
    # *一定要先对每个分组内的标记点排序!* 顺序乱了的话,距离计算完全失效
    sorted_group = group.sort_values('marker_id')
    
    # 计算同道路内相邻标记点的路段距离
    sorted_group['segment_distance'] = sorted_group['mileage'].diff()
    
    # 计算从道路起点到当前标记点的累计距离
    # 如果是地理坐标,把这里换成haversine公式计算实际地理距离即可
    sorted_group['cumulative_distance'] = sorted_group['mileage']
    
    return sorted_group

步骤2:分组后一次性应用函数

不用循环,直接用groupby+apply就能搞定所有道路的计算:

result_df = df.groupby('road', group_keys=False).apply(process_road_group)

运行后,result_df里会新增两个列,分别是同道路内的相邻路段距离和累计距离,完全不会出现跨道路计算的错误~

场景2:对每个道路统计两个指标(比如总长度、平均路段长度)

如果你的需求是给每条道路计算两个统计值,不用给每个标记点加列,那用agg更高效:

summary_df = df.groupby('road').agg(
    # 第一个函数:计算道路总长度
    total_road_length=('mileage', lambda x: x.max() - x.min()),
    # 第二个函数:计算相邻路段的平均长度
    avg_segment_length=('mileage', lambda x: x.diff().dropna().mean())
)

这样直接得到每个道路的两个统计结果,同样不需要循环处理分组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:16:33