【问题标题】:Pandas - Euclidean Distance Between ColumnsPandas - 列之间的欧几里得距离
【发布时间】:2021-03-11 00:31:19
【问题描述】:

我有一个如下的数据框:

           uuid        x_1         y_1         x_2         y_2
0        di-ab5      82.31      184.20      148.06      142.54  
1        di-de6      92.35      185.21       24.12       16.45
2        di-gh7     123.45        0.01         NaN         NaN 
...

我正在尝试在新列中计算[x_1, y_1][x_2, y_2] 之间的欧几里得距离(在此示例中不是实际值)。

           uuid       dist
0        di-ab5      12.31    
1        di-de6      62.35   
2        di-gh7        NaN

注意事项:

  1. 某些行在某些数据点上有NaN
  2. 可以将原始数据框中的数据表示为点(即[1.23, 4.56]),而不是拆分 x 和 y 坐标

我目前正在使用以下脚本:

df['dist']  = np.sqrt((df['x_1'] - df['x_2'])**2 + (df['y_1'] - df['y_2'])**2)

但它看起来很冗长并且经常失败。 有没有更好的方法来使用 pandas、numpy 或 scipy?

【问题讨论】:

  • 你总是可以写一个函数来隐藏单调。 getdist(df, '1', '2')
  • 对,更大的问题不是循环,而是计算,有没有可以使用的pandas、numpy或scipy函数?
  • 好吧,用 Google 的 30 秒把我带到了 numpy.linalg.norm。
  • ((df['x_1'] - df['x_2'])**2 + (df['y_1'] - df['y_2'])**2)**0.5?

标签: python pandas numpy


【解决方案1】:

你可以使用np.linalg.norm,即:

df['dist'] = np.linalg.norm(df.iloc[:, [1,2]].values - df.iloc[:, [3,4]], axis=1)

输出:

     uuid     x_1     y_1     x_2     y_2        dist
0  di-ab5   82.31  184.20  148.06  142.54   77.837125
1  di-de6   92.35  185.21   24.12   16.45  182.030960
2  di-gh7  123.45    0.01     NaN     NaN         NaN

【讨论】:

  • 谢谢 - 但最后一行的距离应该是 NaN,因为第二点包含 NaN - 不知道如何用您的解决方案实现这一点。
  • 只需删除ffill 部分。我已经编辑过了。
  • 其实我只是添加了一个矢量化的形式。
【解决方案2】:
def getDist( df, a, b ):
    return np.sqrt((df[f'x_{a}']-df[f'x_{b}'])**2+(df[f'y_{a}']-df[f'y_{b}'])**2)

【讨论】:

    【解决方案3】:
    np.sqrt((df.filter(like='x').agg('diff',1).sum(1)**2)+(df.filter(like='y').agg('diff',1).sum(1)**2))
    

    工作原理

    分别过滤x和y

    df.filter(like='x')
    

    求跨柱差并平方。

    df.filter(like='x').agg('diff',1).sum(1)**2
    

    将两个结果相加,求平方根。

    np.sqrt((df.filter(like='x').agg('diff',1).sum(1)**2)+(df.filter(like='y').agg('diff',1).sum(1)**2))
    

    【讨论】:

      【解决方案4】:

      使用 numpy 的另一种解决方案:

      diff = (df[['x_1','y_1']].to_numpy()-df[['x_2','y_2']].to_numpy())
      df['dist'] = np.sqrt((diff*diff).sum(-1))
      

      输出:

          uuid    x_1     y_1     x_2     y_2     dist
      0   di-ab5  82.31   184.20  148.06  142.54  77.837125
      1   di-de6  92.35   185.21  24.12   16.45   182.030960
      2   di-gh7  123.45  0.01    NaN     NaN     NaN
      

      【讨论】:

        猜你喜欢
        • 2011-01-29
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2013-03-02
        • 2016-02-15
        相关资源
        最近更新 更多