【问题标题】:Find Closest Value to Input in Pandas Dataframe在 Pandas 数据框中查找最接近输入的值
【发布时间】:2021-02-16 04:50:19
【问题描述】:

我的数据框的第一行如下所示。列是经度、纬度和值。此数据框可扩展 3000 万行。

-179.979166666666657 89.9791666666666714 -3.39999995214436425e+38
-179.9375 89.9791666666666714 -3.39999995214436425e+38
-179.895833333333343 89.9791666666666714 -3.39999995214436425e+38
-179.854166666666657 89.9791666666666714 -3.39999995214436425e+38
-179.8125 89.9791666666666714 -3.39999995214436425e+38
-179.770833333333343 89.9791666666666714 -3.39999995214436425e+38
-179.729166666666657 89.9791666666666714 -3.39999995214436425e+38
-179.6875 89.9791666666666714 -3.39999995214436425e+38
-179.645833333333343 89.9791666666666714 -3.39999995214436425e+38

我试图找到与给定输入最近的经度和纬度点,然后打印出与最接近的经度和纬度相关的值。我曾尝试将数据框转换为数组,然后使用此算法搜索最小值:

def match (lon, lat):
    min=10000
    minindex=-1
    for x in range (len (mintemparr)):
        if (abs ((float (lon))-float (mintemparr [x][0])))+(abs ((float (lat))-float (mintemparr [x] 
        [1])))<min:
             
              min=(abs ((float (lon))-float (mintemparr [x][0])))+(abs ((float (lat))-float 
             (mintemparr [x][1])))
       minindex=x
    result=mintemparr [minindex][2]
    return result 

但是,这非常慢。有没有更直接的方法可以在 pandas 中搜索最接近的值,而不是将其转换为数组。

提前致谢。

【问题讨论】:

  • 您的数据框索引是经度还是纬度?如果没有,请考虑对它们进行索引。然后你应该能够搜索经度和纬度。那不行吗?

标签: python pandas


【解决方案1】:
def find_closest(df, lat, lon):
    dist = (df['lat'] - lat).abs() + (df['lon'] - lon).abs()
    return df.loc[dist.idxmin()]

>>> find_closest(df, -179, 90)
lat     -1.796458e+02
lon      8.997917e+01
value   -3.400000e+38
Name: 8, dtype: float64

【讨论】:

    【解决方案2】:

    您可以通过使用 pandas 来做到这一点。我将为与给定值的差异创建一个列,然后是纬度和经度的平方差之和的平方根。然后我得到了分钟。 假设您的数据框名为 df,其中包含 latitude、longitude and value 列:

    lon=-179.979164
    
    lat=89.979162
    
    df['sumofdiff']=df.assign(landif=df['longitude']-lon).assign(latdiff=df['latitude']-lat).eval("x=(landif*landif)+(latdiff*latdiff)")['x'].apply(np.sqrt)
    
    df[df.sumofdiff == df.sumofdiff.min()]
    
    
        longitude   latitude         value      diff  sumofdiff
    0 -179.979167  89.979167 -3.400000e+38  0.000005   0.000005
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-05
      • 2022-01-21
      • 2013-03-29
      • 1970-01-01
      • 2015-07-18
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多