【问题标题】:Euclidean distance between two pandas dataframes两个熊猫数据框之间的欧几里得距离
【发布时间】:2019-09-30 13:59:13
【问题描述】:

我有两个数据框:

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)

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

【问题讨论】:

  • 我很抱歉。我很困惑。也许是我。也许你需要一个minimal reproducible example
  • 为什么你认为这不起作用,你只需要 argmin ,位置......
  • @WeNYoBen 好吧,它返回一个矩阵而不是单个 2 列数组,其中包含用户 ID 和与用户 214 的距离。我不明白如何使用 argmin 来完成。你能详细说明一下吗?
  • @Quubix 我已经添加了

标签: pandas dataframe scipy


【解决方案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])

【讨论】:

  • 谢谢!这正是我所需要的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    所以你的情况

    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
    

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 2021-01-16
      • 2018-05-26
      • 2021-01-13
      • 2020-09-15
      • 2019-06-19
      • 2017-09-15
      • 1970-01-01
      相关资源
      最近更新 更多