两个熊猫数据框之间的欧式距离

时间:2019-05-13 15:10:39

标签: pandas dataframe scipy

我有两个数据框:

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的用户。

我发现了this answer,但这不是我所需要的,因为我的两个数据框具有相同的形状,并且我需要以每行的方式计算距离:

Euclidean_Distance_i(row_i_df1, row_i_df2)

,并将所有这些距离保存在与这些数据帧长度相同的列表中。

3 个答案:

答案 0 :(得分:1)

尝试:

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])

答案 1 :(得分:1)

我们首先可以将坐标作为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数组是每行所需的距离。

答案 2 :(得分:1)

所以就您而言

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