8

我得到了一个数据框,其中有两列分别保存经度和纬度坐标:

将熊猫导入为 pd

values = {'Latitude': {0: 47.021503365600005,
  1: 47.021503365600005,
  2: 47.021503365600005,
  3: 47.021503365600005,
  4: 47.021503365600005,
  5: 47.021503365600005},
 'Longitude': {0: 15.481974060399999,
  1: 15.481974060399999,
  2: 15.481974060399999,
  3: 15.481974060399999,
  4: 15.481974060399999,
  5: 15.481974060399999}}

df = pd.DataFrame(values)
df.head()

现在我想在数据帧上应用滚动窗口函数,该函数采用一行和另一行的经度和纬度(两列)(窗口大小 2)来计算半正弦距离。

def haversine_distance(x):
    print (x)

df.rolling(2, axis=1).apply(haversine_distance)

我的问题是我从来没有得到所有四个值 Lng1、Lat1(第一行)和 Lng2、Lat2(第二行)。如果我使用axis = 1,那么我将获得第一行的Lng1和Lat1。如果我使用axis = 0,那么我将获得第一行和第二行的Lng1和Lng2,但只有经度。

如何使用两行两列应用滚动窗口?有点像这样:

def haversine_distance(x):
    row1 = x[0]
    row2 = x[1]
    lng1, lat1 = row1['Longitude'], row1['Latitude']
    lng2, lat2 = row2['Longitude'], row2['Latitude']
    # do your stuff here
    return 1

目前,我正在通过 shift(-1) 将数据框与自身连接起来进行此计算,从而将所有四个坐标都放在一行中。但是滚动也应该是可能的。另一种选择是将 Lng 和 Lat 组合到一个列中,并在其上应用 axis=0 的滚动。但一定有更简单的方法,对吧?

4

1 回答 1

8

从 pandas v0.23 开始,现在可以将 aSeries而不是 a传递ndarray给 Rolling.apply()。刚设置raw=False

raw : 布尔值,默认无

False: 将每一行或每一列作为一个系列传递给函数。

TrueNone:传递的函数将接收 ndarray 对象。如果您只是应用 NumPy 缩减功能,这将获得更好的性能。raw 参数是必需的,如果未传递,将显示 FutureWarning。将来 ra​​w 将默认为 False。

0.23.0 版中的新功能。

因此,基于您给定的示例,您可以将纬度移动到索引并将整个经度系列(包括索引)传递给您的函数:

df = df.set_index('Latitude')
df['Distance'] = df['Longitude'].rolling(2).apply(haversine_distance, raw=False)
于 2018-08-26T19:17:04.143 回答