尝试根据每个数据帧中的经纬度差异比较两个数据帧

Posted

技术标签:

【中文标题】尝试根据每个数据帧中的经纬度差异比较两个数据帧【英文标题】:Trying to compare two data frames based on difference between latitude and longitude in each data frame 【发布时间】:2021-02-19 17:41:48 【问题描述】:

我正在尝试比较两个数据框中的经纬度坐标。如果 latitude_fuze 的差异

这是我正在测试的代码。

lat1 = df_result['latitude_fuze']
lon1 = df_result['longitude_fuze']
lat2 = df_airports['latitude_air']
lon2 = df_airports['longitude_air']

fuze_rows=range(df_result.shape[0])
air_rows=range(df_airports.shape[0])

for r in fuze_rows:
    lat = df_result.loc[r,lat1]
    max_lat = lat + .01
    min_lat = lat - .01
    lon = df_result.loc[r,lon1]
    max_lon = lon + .01
    min_lon = lon - .01
    for a in air_rows:
        if (min_lat <= df_airports.loc[a,lat2] <= max_lat) and (min_lon <= df_airports.loc[a,lon2] <= max_lon):
            df_result['Type'] = 'Airport'

这里有两个示例数据框:

# Import pandas library 
import pandas as pd 
  
# initialize list of lists 
data = [['NY', 'Uniondale', 'Nassau', '40.72', '-73.59'], 
        ['NY', 'Uniondale', 'Nassau', '40.72', '-73.59'],
        ['NY', 'Uniondale', 'Nassau', '40.72', '-73.59'],
        ['NY', 'NY', 'New York', '40.76', '73.98'],
        ['NY', 'NY', 'New York', '40.76', '73.98']] 
  
# Create the pandas DataFrame 
df_result = pd.DataFrame(data, columns = ['state', 'city', 'county','latitude_fuze','longitude_fuze']) 
# print dataframe. 
df_result

还有……

data = [['New York', 'JFK', '40.64', '-73.78'], 
        ['New York', 'JFK', '40.64', '-73.78'],
        ['Los Angeles', 'LAX', '33.94', '-118.41'],
        ['Chicago', 'ORD', '41.98', '-87.90'],
        ['San Francisco', 'SFO', '37.62', '-122.38']] 
  
# Create the pandas DataFrame 
df_airports = pd.DataFrame(data, columns = ['municipality_name', 'airport_code', 'latitude_air','longitude_air']) 
# print dataframe. 
df_airports

运行此代码时,我收到此错误:

KeyError: "None of [Float64Index([40.719515, 40.719515, 40.719515,  40.75682,  40.75682,  40.75682,\n               40.75682,  40.75682,  40.75682,   40.7646,\n              ...\n                40.0006,   40.0006,   40.0006,   40.0006,   40.0006,   40.0006,\n                40.0006, 39.742417, 39.742417, 39.742417],\n             dtype='float64', length=1720)] are in the [index]"

如果使用 KNN 或 Haversine 方法进行计算更好,我对此持开放态度。我不是在这里寻找距离,而是在纬度和经度数字上寻找相似之处。如果我确实需要计算距离以使其正常工作,请告诉我。谢谢大家。

【问题讨论】:

【参考方案1】:

我不确定您需要采取什么方法,因为我不是 100% 清楚您要做什么。但是,这样的事情可能有助于让您当前的方法发挥作用:

# join the two dataframes - must be the same length
df = pd.concat([df_result, df_airports], axis=1)

# cast latitudes and longitudes to numeric
cols = ["latitude_fuze", "latitude_air", "longitude_fuze", "longitude_air"]
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce', axis=1)

# create a mask where our conditions are met (difference between lat fuze and lat air < 0.1 and difference between long fuze and long air < 0.1)
mask = ((abs(df["latitude_fuze"] - df["latitude_air"]) < 0.1) & (abs(df["longitude_fuze"] - df["longitude_air"]) < 0.1))

# fill the type column
df.loc[mask, 'Type'] = "Airport"

【讨论】:

这看起来很接近,但这里有些不对劲。这两个数据帧肯定是不同的长度; df_result 有 1,720 条记录,df_airport 有 22,216 条记录。所以,轴不能是 1。我试过这个: df = pd.merge(result, airports, how="inner", left_on="latitude_fuze", right_on="latitude_air") 出于某种奇怪的原因,所有 lat &长坐标转换为 0.00! 仔细观察后,我认为您的解决方案很好。我认为我的业务数据框中的经纬度坐标有点偏离。我在网上找到了机场数据框,因为它是免费的,所以我不确定数据的质量。我认为两个文件中的坐标都有一点偏差,所以我将把

以上是关于尝试根据每个数据帧中的经纬度差异比较两个数据帧的主要内容,如果未能解决你的问题,请参考以下文章

pyspark,比较数据帧中的两行

如何根据原始数据帧中的总行数将数据帧拆分为两个数据帧

有没有办法使用 pgeocode 加快在大型数据帧上查询邮政编码的经纬度?

如何根据 R 中的另一个数据帧解码一个数据帧中变量的值?

返回两个数据帧中两个长纬度坐标的每行和每列之间的最小距离

如果日期介于第二个数据帧中的两个日期之间,则 r 标记第一个数据帧中的行