【问题标题】:Iterate over Pandas index pairs [0,1],[1,2][2,3]迭代 Pandas 索引对 [0,1],[1,2][2,3]
【发布时间】:2016-10-04 04:11:08
【问题描述】:

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

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

一些谷歌搜索给了我下面的 hasrsine 方法,该方法使用使用 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

【问题讨论】:

  • 试试for i in range(len(df))

标签: python pandas


【解决方案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)

或者,如果您不想像那样修改您的 hasrsine 函数,您可以使用 df.ix[i, 'lon'], df.ix[i, ' 一次选择一个纬度和经度lat'], df.ix[i+1, 'lon] 等

【讨论】:

  • 这就是我要找的东西,关于如何添加df.groupby statement 的任何想法?
  • 基本语法可以是... df.ix[:,['lat', 'lon']].groupby('lat').agg({'lon': np .mean})... 这将为您提供每个唯一纬度的平均 lon... 这不是一个有用的结果,但说明了基本语法。
【解决方案2】:

我建议使用更快的循环方式来遍历 df 这样的 has

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2015-02-14
    • 2019-07-28
    • 2019-08-15
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多