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

Python 尝试根据每个数据帧中纬度和经度的差异比较两个数据帧,python,python-3.x,latitude-longitude,haversine,Python,Python 3.x,Latitude Longitude,Haversine,我试图比较两个数据帧中的纵横坐标。如果纬度引信的差值小于0.01纬度引信的差值,如果经度引信的差值小于0.01经度引信的差值,那么我想将字段df_结果['Type']更新为“Airport”。基本上,我有一个带有机场lat和long坐标的DF,如果这些坐标与我的业务DF中的lat和long坐标非常相似,我想在业务DF中添加一个标志,表明这是一个机场 下面是我正在测试的代码 lat1 = df_result['latitude_fuze'] lon1 = df_result['longitude_

我试图比较两个数据帧中的纵横坐标。如果纬度引信的差值小于0.01纬度引信的差值,如果经度引信的差值小于0.01经度引信的差值,那么我想将字段df_结果['Type']更新为“Airport”。基本上,我有一个带有机场lat和long坐标的DF,如果这些坐标与我的业务DF中的lat和long坐标非常相似,我想在业务DF中添加一个标志,表明这是一个机场

下面是我正在测试的代码

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'
而且

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或哈弗森方法进行计算更好,我愿意接受。我不是在这里寻找距离,而是在横向和纵向数字上寻找相似之处。如果我真的需要计算距离来正确工作,请让我知道。谢谢大家。

我不确定您需要采取什么方法,因为我不完全清楚您想要做什么。但是,类似这样的内容可能有助于使您当前的方法发挥作用:

# 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=pd.concat([df_结果,df_机场],轴=1)
#将纬度和经度转换为数字
cols=[“纬度引信”、“纬度空气”、“经度引信”、“经度空气”]
df[cols]=df[cols].apply(pd.to_numeric,errors='concure',axis=1)
#在符合我们条件的地方制作一个遮罩(横向引信和横向空气之间的差值<0.1,长引信和纵向空气之间的差值<0.1)
遮罩=((abs(df[“纬度引信”]-df[“纬度引信”])<0.1)和(abs(df[“经度引信”]-df[“经度引信”])<0.1))
#填写“类型”列
df.loc[掩码,'类型']=“机场”

我不确定您需要采取什么方法,因为我不完全清楚您想要做什么。但是,类似这样的内容可能有助于使您当前的方法发挥作用:

# 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=pd.concat([df_结果,df_机场],轴=1)
#将纬度和经度转换为数字
cols=[“纬度引信”、“纬度空气”、“经度引信”、“经度空气”]
df[cols]=df[cols].apply(pd.to_numeric,errors='concure',axis=1)
#在符合我们条件的地方制作一个遮罩(横向引信和横向空气之间的差值<0.1,长引信和纵向空气之间的差值<0.1)
遮罩=((abs(df[“纬度引信”]-df[“纬度引信”])<0.1)和(abs(df[“经度引信”]-df[“经度引信”])<0.1))
#填写“类型”列
df.loc[掩码,'类型']=“机场”

这看起来很接近,但这里有些不对劲。两个数据帧的长度绝对不同;df_结果有1720条记录,df_机场有22216条记录。所以,轴不能是1。我试过这样做:df=pd.merge(结果,机场,how=“内部”,left\u on=“latitude\u fuze”,right\u on=“latitude\u air”),出于某种奇怪的原因,所有的纬度和经度坐标都转换为0.00!仔细看一下,我认为你的解决方案很好。我认为在我的业务数据框架中,纵横坐标有点偏离。我在网上找到了机场数据框,因为它是免费的,所以我不确定数据的质量。我认为这两个文件中的坐标都有一点偏移,所以我将<0.1改为<1,或者其他什么。我会四处寻找一些替代方法。我刚刚对你的解决方案投了赞成票。这绝对是解决问题的一种方法!非常感谢!!这看起来很近,但有点不对劲。两个数据帧的长度绝对不同;df_结果有1720条记录,df_机场有22216条记录。所以,轴不能是1。我试过这样做:df=pd.merge(结果,机场,how=“内部”,left\u on=“latitude\u fuze”,right\u on=“latitude\u air”),出于某种奇怪的原因,所有的纬度和经度坐标都转换为0.00!仔细看一下,我认为你的解决方案很好。我认为在我的业务数据框架中,纵横坐标有点偏离。我在网上找到了机场数据框,因为它是免费的,所以我不确定数据的质量。我认为这两个文件中的坐标都有一点偏移,所以我将<0.1改为<1,或者其他什么。我会四处寻找一些替代方法。我刚刚对你的解决方案投了赞成票。这绝对是解决问题的一种方法!非常感谢!!