迭代Pandas索引对[0,1],[1,2] [2,3]

时间:2016-10-03 19:10:44

标签: python pandas

我有一个从gps设备创建的lat / lng点的pandas数据帧。

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

一些谷歌搜索给了我下面的半正方法,该方法使用iloc选择的单个值工作,但我正在努力研究如何迭代方法输入的数据帧。

我以为我可以运行一个for循环,其中包含

的内容
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

2 个答案:

答案 0 :(得分: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 [i,' lon']一次一个地选择一个或多个, df.ix [i,' lat'],df.ix [i + 1,' lon]等。

答案 1 :(得分:0)

我建议使用更快的变量循环通过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)