对每组的第一行和第二行进行操作
我有如下数据框:
| 序号 | 序列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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。