Pandas Dataframe滚动有两列和两行

时间:2017-11-20 11:01:30

标签: python pandas rolling-computation

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

将pandas导入为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组合成一列,并将轴= 0的滚动应用到该列上。但是必须有一种更简单的方法,对吗?

1 个答案:

答案 0 :(得分:3)

Since pandas v0.23 it is now possible to pass a Series instead of a ndarray to Rolling.apply()。只需设置raw=False

  

原始:布尔值,默认为无

     

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

     

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

     

0.23.0版中的新功能。

因此,在给定的示例基础上,您可以将纬度移至索引,然后将整个经度序列-包括索引-传递给函数:

df = df.set_index('Latitude')
df['Distance'] = df['Longitude'].rolling(2).apply(haversine_distance, raw=False)