2017-04-09 63 views
3

我有一個數據幀,其中包含Lines,PointID,X和Y座標;每行包括一組與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') 

我肯定做錯了事,因爲我得到的結果是線條的第一個點與線條中每個連續點之間的累積距離,而不是接收由連續點創建的每個單獨線段之間的距離(元組的座標)。

回答

2

您可以使用shift()查找LINE中每個點的上一個點的座標值XY。然後計算這點和前一個點之間的距離:

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值可以在適合你的用例的方式來填補。

相關問題