首页 > 解决方案 > Python按数字列匹配两个数据框

问题描述

我有两个数据框,每个都有经度和纬度。df1 是带有坐标的小地方,df2 是带有城市中心坐标的城市名称。我想通过在 df2 中找到最近的坐标,为 df1 中的每个位置分配一个城市名称。

df1好像:

location     lng       lat          
a            117        33
b            114        32
c            101        23
d            131        46

df2好像:

city         citylng   citylat
X             100       20
Y             130       40
Z             115       30

一个可能的标准可以是 (1) 计算坐标之间的差并将差求和。(2) 选择差和最小的城市。例如 和 的坐标之差location acity Zabs(117-115)+abs(33-30)=5(a,X)= abs(117-100)+abs(33-20)=30(a,Y)= abs(117-130)+abs(33-40)=20。因此,我们有:

location     city       
a            Z

有没有办法在 Python 中对此进行编码?

标签: pythonpandasdataframe

解决方案


我们可以通过numpy广播和argmin

s1=df1.lng.values
s2=df1.lat.values
idx=np.abs(s1-df2.citylng.values[:,None] + s2 - df2.citylat.values[:,None]).argmin(axis=0)
df1['city']=df2.city.iloc[idx].values
df1
  location  lng  lat city
0        a  117   33    Z
1        b  114   32    Z
2        c  101   23    X
3        d  131   46    Y

推荐阅读