我有一个包含Lines,PointID,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)
我的Attemp是创建一个DataFrame,使用groupby对行'LINE'进行分组 然后使用scipy计算一条线内连续点之间的欧氏距离:
predist = df.groupby(['LINE']).apply(lambda x: x)
dist = pdist(predist[['X', 'Y']], 'euclidean')
我肯定做错了,因为我得到的结果是一行中第一个点与一行内每个连续点之间的累积距离,而不是接收连续点创建的每个单独段之间的距离(坐标元组。)
答案 0 :(得分:2)
您可以使用shift()
查找X
中每个点的上一个点的Y
和LINE
坐标。然后计算此点与上一点之间的距离:
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
值可以适合您的用例的方式填充。