2016-10-03 61 views
0

我有一个由gps设备创建的lat/lng点的熊猫数据框。迭代熊猫指数对[0,1],[1,2] [2,3]

我的问题是如何为GPS轨迹线中每个点之间的距离生成距离列。

一些谷歌搜索给了我下面的半方法,它使用单个值使用iloc选择的工作,但我在如何迭代方法输入的数据帧上挣扎。

我原以为我能为循环运行,伴随的

for i in len(df): 
    df['dist'] = haversine(df['lng'].iloc[i],df['lat'].iloc[i],df['lng'].iloc[i+1],df['lat'].iloc[i+1])) 

线的东西,但我得到的错误TypeError: 'int' object is not iterable。我也在考虑df.apply,但我不确定如何获得适当的输入。任何帮助或提示。如何做到这一点将不胜感激。

样品DF

 lat  lng 
0 -7.11873 113.72512 
1 -7.11873 113.72500 
2 -7.11870 113.72476 
3 -7.11870 113.72457 
4 -7.11874 113.72444 

方法

def haversine(lon1, lat1, lon2, lat2): 
    """ 
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees) 
    """ 
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2]) 
    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2 
    c = 2 * math.asin(math.sqrt(a)) 
    km = 6367 * c 
    return km 
+1

尝试'对于i在范围内(len(df))' – jezrael

回答

1

你在找这样的结果呢?

 lat  lon dist2next 
0 -7.11873 113.72512 0.013232 
1 -7.11873 113.72500 0.026464 
2 -7.11873 113.72476 0.020951 
3 -7.11873 113.72457 0.014335 
4 -7.11873 113.72444  NaN 

有可能是pandas.rolling_apply使用一个聪明的办法......但对于一个快速的解决方案,我会做这样的事情。

def haversine(loc1, loc2): 
    # convert decimal degrees to radians 
    lon1, lat1 = map(math.radians, loc1) 
    lon2, lat2 = map(math.radians, loc2) 

    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2 
    c = 2 * math.asin(math.sqrt(a)) 
    km = 6367 * c 
    return km 

df['dist2next'] = np.nan 
for i in df.index[:-1]: 
    loc1 = df.ix[i, ['lon', 'lat']] 
    loc2 = df.ix[i+1, ['lon', 'lat']] 
    df.ix[i, 'dist2next'] = haversine(loc1, loc2) 

另外,如果你不想改变像您半正矢函数,你可以使用df.ix [我,“LON”],df.ix摘下拉特和离子吸附一次一个[I, 'LAT'],df.ix第[i + 1,“LON]等

+0

这就是我正在寻找,关于如何添加'df.groupby'语句的任何想法? – hselbie

+0

基本语法可以是类似... df.ix [:,['lat','lon']]。groupby('lat')。agg({'lon':np.mean})...这将给你每个独特的纬度的平均值...不是一个有用的结果,但说明了基本的语法。 – kmh

0

我recommande使用通过这样的循环DF的更快的变化已经

df_shift = df.shift(1) 
df = df.join(df_shift, l_suffix="lag_") 
log = [] 

for rows in df.itertuples(): 
    log.append(haversine(rows.lng ,rows.lat, rows.lag_lng, rows.lag_lat)) 

pd.DataFrame(log)