2017-04-09 10 views
3

선, 점 ID, X 및 Y 좌표가 포함 된 데이터 프레임이 있습니다. 각 라인은 X와 점들의 그룹을 포함하는, Y 좌표 :라인 목록에 속한 연속 점 (x, y 튜플) 간의 반복 유클리드 거리 계산

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) 

내이 시도했다 :

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 

다음 결과로 수득 라인 내에 연속 점 사이의 유클리드 거리를 계산하려고

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

dist = pdist(predist[['X', 'Y']], 'euclidean') 
,369 : 라인 "LINE" 그룹 GROUPBY 사용하고 scipy를 사용하여 라인 내에 연속 점 사이의 유클리드 거리를 계산하는 DataFrame을 만들

나는 분명히 잘못된 결과를 얻고 있습니다. 왜냐하면 연속적인 포인트 (터플 (tuple)로 생성 된 각 개별 세그먼트 (segment) 사이의 거리를받는 대신 라인 내의 첫 번째 포인트와 라인 사이의 누적 거리입니다. 좌표의).

답변

2

을 사용하면 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 값은 쓰임새에 맞는 방법으로 충전 할 수 있습니다.