我有两个dataframes:
表格的df1
user_id | x_coord | y_coord
214 -55.2 22.1
214 -55.2 22.1
214 -55.2 22.1
...
和 df2
,具有相同的形式,但使用不同的用户:
user_id | x_coord | y_coord
512 -15.2 19.1
362 65.1 71.4
989 -84.8 13.7
...
这个想法是,我想在df1
中的用户与df2
中的所有用户之间找到欧几里得距离。为此,我需要能够根据最后两列计算两个数据范围之间的欧几里得距离,以便找出第二个数据框中最接近的用户与用户214.
我找到了这个答案,但这不是我需要的,因为我的两个数据范围具有相等的形状,我需要以每行计算的距离:
Euclidean_Distance_i(row_i_df1, row_i_df2)
并将所有这些距离保存在与这些数据框相同长度的列表中。
尝试:
def Euclidean_Dist(df1, df2, cols=['x_coord','y_coord']):
return np.linalg.norm(df1[cols].values - df2[cols].values,
axis=1)
测试:
df1 = pd.DataFrame({'user_id':[214,214,214],
'x_coord':[-55.2,-55.2,-55.2],
'y_coord':[22.1,22.1,22.1]})
df2 = pd.DataFrame({'user_id':[512, 362, 989],
'x_coord':[-15.2, 65.1, -84.8],
'y_coord':[19.1, 71.4, 13.7]})
Euclidean_Dist(df1, df2)
输出:
array([ 40.11234224, 130.0099227 , 30.76881538])
,因此在您的情况下
from scipy.spatial import distance
ary = distance.cdist(df1.iloc[:,1:], df2.iloc[:,1:], metric='euclidean')
df2.iloc[ary.argmin(1),0]
Out[759]:
2 989
2 989
2 989
Name: user_id, dtype: int64
df1['close_from_df2']=df2.iloc[ary.argmin(1),0].values
我们首先可以将坐标作为numpy数组。
x1 = df1.x_coord.values
x2 = df2.x_coord.values
y1 = df1.y_coord.values
y2 = df2.y_coord.values
然后我们可以计算平方距离
d2 = np.square( x2 - x1 ) + np.square( y2 - y1 )
distances = np.sqrt( d2 )
distances
数组是每排所需的距离。