dataframe1 有2列信息info经纬度dataframe2 有3列信息 小区名info经纬度从dataframe2 中匹配相同info 最近的距离的小区名到dataframe1
下面是一个可能的解决方案:
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,即得到了我们想要的结果
原文地址: https://www.cveoy.top/t/topic/eoaD 著作权归作者所有。请勿转载和采集!