下面是一个可能的解决方案:

import pandas as pd
from geopy.distance import geodesic

# 创建样例数据
df1 = pd.DataFrame({'info': ['A', 'B', 'C'],
                    'latitude': [30.0, 31.0, 32.0],
                    'longitude': [120.0, 121.0, 122.0]})
df2 = pd.DataFrame({'name': ['小区1', '小区2', '小区3'],
                    'info': ['A', 'B', 'C'],
                    'latitude': [30.1, 31.2, 32.3],
                    'longitude': [120.1, 121.2, 122.3]})

# 定义一个计算两点距离的函数
def calc_distance(lat1, lon1, lat2, lon2):
    return geodesic((lat1, lon1), (lat2, lon2)).km

# 对于df1中的每一行,找到和它info相同的df2中距离最近的行
def find_nearest(row):
    tmp = df2[df2['info'] == row['info']]
    distances = [calc_distance(row['latitude'], row['longitude'], tmp.iloc[i]['latitude'], tmp.iloc[i]['longitude']) for i in range(len(tmp))]
    nearest_idx = distances.index(min(distances))
    return tmp.iloc[nearest_idx]['name']

# 在df1中添加一列,值为和它info相同的df2中距离最近的行的name
df1['nearest_name'] = df1.apply(find_nearest, axis=1)

print(df1)

输出结果:

  info  latitude  longitude nearest_name
0    A      30.0      120.0         小区1
1    B      31.0      121.0         小区2
2    C      32.0      122.0         小区3

解释一下代码:

首先,我们导入了pandas和geopy库。pandas用于处理数据,geopy用于计算地球上两点之间的距离。

然后,我们创建了两个样例数据——df1和df2。df1有info、latitude和longitude三列信息,表示这些信息对应的经纬度。df2有name、info、latitude和longitude四列信息,表示小区的名字、这个小区对应的info以及这个小区的经纬度。

接下来,我们定义了一个计算两点距离的函数,使用geopy库实现。

然后,我们定义了一个find_nearest函数,它的输入是df1中的一行数据,输出是和这个数据info相同的df2中距离最近的行的name。这个函数的实现过程如下:

首先,我们从df2中找到和输入行info相同的所有行,并保存在tmp变量中。

然后,我们计算输入行和每个tmp中的行之间的距离,并保存在distances列表中。

接着,我们找到distances中最小的值,并保存它的索引nearest_idx。

最后,我们返回tmp中索引为nearest_idx的行的name值。

最后,我们使用apply函数在df1的每一行上应用find_nearest函数,得到和它info相同的df2中距离最近的行的name值,并将这个值保存在df1的nearest_name列中。

最终,我们打印出df1,即得到了我们想要的结果

dataframe1 有2列信息info经纬度dataframe2 有3列信息 小区名info经纬度从dataframe2 中匹配相同info 最近的距离的小区名到dataframe1

原文地址: https://www.cveoy.top/t/topic/eoaD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录