Pandas数据帧滚动,包含两列和两行

8
我得到了一个包含经纬度坐标的两列数据框:

import pandas as 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)将数据框与自身连接来进行这个计算,从而使得所有四个坐标都在一行中。但也可以使用rolling方法实现。另一种选择是将Lng和Lat合并到一列中,并对其应用axis=0的rolling方法。但肯定有更简单的方法,对吧?


我不确定是否有更简便的方法 - 我建议使用 shift(-1) 进行连接,并将您的函数应用于每一行是最有效的方法。我不知道是否有一种同时在多个列上应用滚动窗口函数的方法。 - Ken Syme
可能是Python pandas rolling_apply two column input into function的重复问题。 - Jt Miclat
1个回答

8

自pandas v0.23以来,现在可以将Series传递给Rolling.apply()而不是ndarray。只需将raw=False

raw: 布尔值,默认为无

False: 将每行或每列作为Series传递给函数。

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)

5
三列? - Ludo Schmidt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接