簡體   English   中英

Pandas Dataframe滾動有兩列和兩行

[英]Pandas Dataframe rolling with two columns and two rows

我有一個數據框,其中有兩列保持經度和緯度坐標:

將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的滾動應用到該列上。 但必須有一個更簡單的方法,對嗎?

從pandas v0.23開始,現在可以將Series而不是ndarray給Rolling.apply() 只需設置raw=False

raw :bool,默認無

False :將每行或每列作為Series傳遞給函數。

TrueNone :傳遞的函數將接收ndarray對象。 如果您只是應用NumPy減少功能,這將獲得更好的性能。 原始參數是必需的,如果未傳遞,將顯示FutureWarning。 將來raw將默認為False。

版本0.23.0中的新功能。

因此,基於您給定的示例,您可以將緯度移動到索引並將整個經度系列(包括索引)傳遞給您的函數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM