2016-11-25 4 views
0

일부 위치의 위도와 경도가 포함 된 lat_long이라는 데이터 프레임이 있습니다. 나는 각각의 다음 위치의 차이점을 찾고 싶다. 예제 haversine 함수를 사용할 때 오류가 발생합니다. KeyError : ('1', 색인 0에 u'curred 됨).데이터 프레임에서 Haversine 함수로 데이터를 호출하는 방법

1   2 
0 -6.081689 145.391881 
1 -5.207083 145.788700 
2 -5.826789 144.295861 
3 -6.569828 146.726242 
4 -9.443383 147.220050 

def haversine(row): 
    lon1 = lat_long['1'] 
    lat1 = lat_long['2'] 
    lon2 = row['1'] 
    lat2 = row['2'] 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 
    c = 2 * arcsin(sqrt(a)) 
    km = 6367 * c 
    return km 

lat_long['distance'] = lat_long.apply(lambda row: haversine(row), axis=1) 
lat_long 
+0

당신이 뜻하는 일 – Batman

+0

다음 행마다 차이점을 찾고 싶습니다. –

+1

@AmyRose, [that] (http://stackoverflow.com/a/40453439/5741205) 원하는게 뭐야? – MaxU

답변

2

this solution을 시도해보십시오

def haversine_np(lon1, lat1, lon2, lat2): 
    """ 
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees) 

    All args must be of equal length.  

    """ 
    lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2]) 

    dlon = lon2 - lon1 
    dlat = lat2 - lat1 

    a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2 

    c = 2 * np.arcsin(np.sqrt(a)) 
    km = 6367 * c 
    return km 

데모 : "각 행의 거리"

In [17]: df 
Out[17]: 
     lat   lon 
0 -6.081689 145.391881 
1 -5.207083 145.788700 
2 -5.826789 144.295861 
3 -6.569828 146.726242 
4 -9.443383 147.220050 

In [18]: df['dist'] = \ 
    ...:  haversine_np(df.lon.shift(), df.lat.shift(), df.ix[1:, 'lon'], df.ix[1:, 'lat']) 

In [19]: df 
Out[19]: 
     lat   lon  dist 
0 -6.081689 145.391881   NaN 
1 -5.207083 145.788700 106.638117 
2 -5.826789 144.295861 178.907364 
3 -6.569828 146.726242 280.904983 
4 -9.443383 147.220050 323.913612 
+0

고맙습니다 매우 mcuh –

+0

@AmyRose, 당신은 환영합니다 :) – MaxU

관련 문제