Python 属于直线列表的连续点(x,y元组)之间的迭代欧氏距离计算

Python 属于直线列表的连续点(x,y元组)之间的迭代欧氏距离计算,python,pandas,scipy,geopandas,Python,Pandas,Scipy,Geopandas,我有一个数据框,它包含线、点ID、X和Y坐标;每条线包含一组具有X、Y坐标的点: LINE Point ID X coordinate Y Coordinate A 1 1 2 A 2 2 2 A 3 3 2 B 1 11

我有一个数据框,它包含线、点ID、X和Y坐标;每条线包含一组具有X、Y坐标的点:

LINE    Point ID    X coordinate    Y Coordinate
 A         1             1               2
 A         2             2               2
 A         3             3               2
 B         1             11              3
 B         2             12              3
 B         3             13              3
尝试计算直线内连续点之间的欧几里德距离,以获得以下结果:

LINE    Point ID    X coordinate    Y Coordinate    Euclidean Dist.
  A         1             1              2    
  A         2             2              2                1 (dist between Point ID's 1 and 2 for line A)
  A         3             3              2                1 (dist between Point ID's 2 and 3 for line A)
  B         1            11              3  
  B         2            12              3                1 (dist between Point ID's 1 and 2 for line B)
  B         3            13              3                1 (dist between Point ID's 2 and 3 for line B)
我的尝试是创建一个数据帧,使用groupby将行分组为“LINE” 然后使用scipy计算直线内连续点之间的欧氏距离:

predist = df.groupby(['LINE']).apply(lambda x: x)

dist = pdist(predist[['X', 'Y']], 'euclidean')
我肯定是做错了什么,因为我得到的结果是直线的第一个点与直线内每个连续点之间的累积距离,而不是接收由连续点(坐标元组)创建的每个单独段之间的距离。

可以使用
shift()
查找
行中每个点的
X
Y
坐标。然后计算此点与上一点之间的距离:

import pandas as pd
import numpy as np

data = """
LINE    PointID          X               Y
 A         1             1               2
 A         2             2               2
 A         3             3               2
 B         1             11              3
 B         2             12              3
 B         3             13              3"""
df = pd.read_csv(StringIO(data),sep="\s+")

dx = (df['X'] - df.groupby('LINE')['X'].shift())
dy = (df['Y'] - df.groupby('LINE')['Y'].shift())
df['dist'] = np.sqrt(dx**2 + dy**2)
这将产生预期的距离:

  LINE  PointID   X  Y  dist
0    A        1   1  2   NaN
1    A        2   2  2   1.0
2    A        3   3  2   1.0
3    B        1  11  3   NaN
4    B        2  12  3   1.0
5    B        3  13  3   1.0

NaN
值可以用适合您的用例的方式填充。

请注意,事实上,您可以跳过为
X
Y
创建唯一变量,而只使用:
diff=(df[[Y',X']-df.groupby('TRACKID')[[Y',X']]]].shift(1))
np.sqrt((diff**2).sum())
要做到这一点,允许在几行中启动,并允许启动任意数量的维度。