Pandas:按同行程ID分组提取下一行值新增经纬度列
你可以直接使用Pandas内置的groupby+shift方法实现需求,步骤和代码如下:
注意前提
先确保你的数据集已经按照id_trip、trip_schedule两个字段升序排序,避免行顺序混乱导致取数错误。
核心实现代码
import pandas as pd # 假设你的原始数据已经读取为DataFrame,变量名为df # 排序步骤(如果数据已经是有序的可以省略,建议保留避免异常) df = df.sort_values(by=['id_trip', 'trip_schedule']).reset_index(drop=True) # 分组后取同组下一行的经纬度作为当前行的stop经纬度 df[['stop_longitude', 'stop_latitude']] = df.groupby('id_trip')[['start_longitude', 'start_latitude']].shift(-1)
代码说明
groupby('id_trip')会按照行程ID拆分数据,所有操作只会在同一个行程的内部生效,不会跨行程取数shift(-1)的作用是将分组内的整列数据向上偏移1位,当前行就能匹配到下一行的对应值,分组内的最后一行没有下一行数据,会自动填充NaN,完全匹配你的需求。
完整测试示例
你可以直接运行下面的代码验证效果:
# 构造测试数据 data = { 'id_trip': ['AAAAAAAA', 'AAAAAAAA', 'BBBBBBBB', 'BBBBBBBB'], 'trip_schedule': [1, 2, 1, 2], 'start_longitude': [-5.697868, -5.698459, -5.696362, -5.696071], 'start_latitude': [42.393038, 42.394158, 42.398740, 42.401731] } df = pd.DataFrame(data) # 执行逻辑 df = df.sort_values(by=['id_trip', 'trip_schedule']).reset_index(drop=True) df[['stop_longitude', 'stop_latitude']] = df.groupby('id_trip')[['start_longitude', 'start_latitude']].shift(-1) # 输出结果 print(df)
运行后输出的结果和你期望的格式完全一致。
内容的提问来源于stack exchange,提问作者Birbiz
相关产品推荐
相关产品推荐

