对每组的第一行和第二行进行操作

编程语言 2026-07-08

我有如下数据框:

序号 序列ID 几何 步数 距离
0 0ae5nT97gFXHwxrYPsuAvS POINT (-77.03842341899872 -12.038213559379837) 0 0
1 0ae5nT97gFXHwxrYPsuAvS POINT (-77.0381498336792 -12.03833947409247) 1 32.8924
2 0ae5nT97gFXHwxrYPsuAvS POINT (-77.03786551952362 -12.038491620958181) 2 35.2449
3 0ae5nT97gFXHwxrYPsuAvS POINT (-77.03759729862213 -12.038659507054811) 3 34.6179
4 0ae5nT97gFXHwxrYPsuAvS POINT (-77.03729152679443 -12.038890350266426) 4 41.9688
import pandas as pd
import geopandas as gpd
from shapely import wkt
from numpy import nan
from pandas import Timestamp

data = {'sequence_id': {0: '0ae5nT97gFXHwxrYPsuAvS', 1: '0ae5nT97gFXHwxrYPsuAvS', 2: '0ae5nT97gFXHwxrYPsuAvS', 3: '0ae5nT97gFXHwxrYPsuAvS', 4: '0ae5nT97gFXHwxrYPsuAvS'}, 'geometry': {0: 'POINT (-77.03842341899872 -12.038213559379837)', 1: 'POINT (-77.0381498336792 -12.03833947409247)', 2: 'POINT (-77.03786551952362 -12.038491620958181)', 3: 'POINT (-77.03759729862213 -12.038659507054811)', 4: 'POINT (-77.03729152679443 -12.038890350266426)'}, 'step': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}, 'distance': {0: 0.0, 1: 32.89242216884188, 2: 35.24494699130865, 3: 34.61789553185383, 4: 41.96875843267647}}

df = pd.DataFrame(data)
df['geometry'] = df['geometry'].apply(wkt.loads)
gdf = gpd.GeoDataFrame(df, geometry='geometry', crs="EPSG:4326")

距离表示当前步x 与前一步之间的距离。 我已经计算好了距离,按步数排序并按序列分组,代码如下:

gdf = gdf.to_crs(gdf.estimate_utm_crs())

gdf_sorted = (
    gdf.sort_values(by=['step'])
    .groupby(['sequence_id'])
    .apply(
        lambda group: group.assign(
            distance=group["geometry"].distance(
                group["geometry"].shift(1)).fillna(0),
            i=group.index.to_series().shift(1)
        ),
        include_groups=False
    )
    .to_crs("epsg:4326")
)

现在可以看到,步骤0 在distance列中始终为0,因为没有前一个点。如何在额外的一列中,或许是新增一列,包含步骤0 与步骤1 之间的距离?

期望输出

序号 序列ID 几何 步数 距离 distance_0_to_1
0 0ae5nT97gFXHwxrYPsuAvS POINT (-77.03842341899872 -12.038213559379837) 0 0 32.8924
1 0ae5nT97gFXHwxrYPsuAvS POINT (-77.0381498336792 -12.03833947409247) 1 32.8924 NA
2 0ae5nT97gFXHwxrYPsuAvS POINT (-77.03786551952362 -12.038491620958181) 2 35.2449 NA
3 0ae5nT97gFXHwxrYPsuAvS POINT (-77.03759729862213 -12.038659507054811) 3 34.6179 NA
4 0ae5nT97gFXHwxrYPsuAvS POINT (-77.03729152679443 -12.038890350266426) 4 41.9688 NA

解决方案

你可以像下面这样使用列 "distance_to_previous" 和 "distance_to_next":

gdf_sorted.rename(columns={"distance":"distance_to_previous"})

gdf_sorted["distance_to_next"]=gdf_sorted["distance_to_previous"].shift(-1).fillna(0)

结果大致会是这样的:

步数 与前一个点的距离 与下一个点的距离
1 0 32.8924
2 32.8924 35.2449
3 35.2449 0

这样新的一列会更干净,不再全是NaN值

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章