两个pandas数据帧之间的欧几里得距离

8

I have two dataframes:

df1 of the form

user_id  | x_coord  | y_coord
 214         -55.2      22.1
 214         -55.2      22.1
 214         -55.2      22.1
...

还有一个与df1形式相同但用户不同的数据框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)

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


抱歉,我很困惑。也许是我自己的问题。也许你需要一个 [mcve]。 - piRSquared
为什么你认为这不起作用,你只需要argmin,带上位置... - BENY
@WeNYoBen 嗯,它返回的是一个矩阵而不是一个包含userID和到用户214的距离的2列数组。我不明白如何使用argmin来完成这个任务。你能详细解释一下吗? - Qubix
@Qubix 我已经添加了。 - BENY
3个回答

10

尝试:

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

谢谢!这正是我所需要的。 - Qubix

2
最初的回答:在你的情况下,
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

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”数组是每行所需的距离。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接