Pandas 两帧数据之间的欧氏距离

Pandas 两帧数据之间的欧氏距离,pandas,dataframe,scipy,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

我有两个数据帧:

表单的
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)
测试:

产出:

array([ 40.11234224, 130.0099227 ,  30.76881538])

我们可以先得到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 )
距离
数组是每行所需的距离。

在您的情况下也是如此

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

我道歉。我很困惑。也许是我。也许你需要一个。为什么你认为这不起作用,你只需要argmin,位置…@WeNYoBen,它返回一个矩阵,而不是一个2列数组,带有用户ID和到用户214的距离。我不明白如何用argmin实现这一点。你能详细解释一下吗?@Qubix我已经补充了,谢谢!这正是我需要的。
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