python - 在 Pandas 数据框中计算点之间最短(欧几里得)距离的最快方法

标签 python pandas numpy euclidean-distance

考虑以下 Pandas 数据框:

print(df)

     Id      X      Y Type  X of Closest  Y of Closest
0   201  73.91  34.84    A           NaN           NaN
1   201  74.67  32.64    A           NaN           NaN
2   201  74.00  33.20    A           NaN           NaN
3   201  71.46  27.70    A           NaN           NaN
4   201  69.32  35.42    A           NaN           NaN
5   201  75.06  24.00    B           NaN           NaN
6   201  74.11  16.64    B           NaN           NaN
7   201  73.37  18.73    B           NaN           NaN
8   201  56.63  26.90    B           NaN           NaN
9   201  73.35  38.83    B           NaN           NaN
10  512  74.15  28.90    A           NaN           NaN
11  512  75.82  17.56    A           NaN           NaN
12  512  74.78  33.21    A           NaN           NaN
13  512  75.43  32.41    A           NaN           NaN
14  512  75.90  25.12    A           NaN           NaN
15  512  79.76  29.49    B           NaN           NaN
16  512  76.47  36.91    B           NaN           NaN
17  512  74.70  19.19    B           NaN           NaN
18  512  78.75  30.53    B           NaN           NaN
19  512  74.60  31.88    B           NaN           NaN

请注意,对于每个 Id,总是有 10 行,5 行是 A 类,5 行是 B 类。

我想创建 2 列,“最近的 X”和“最近的 Y”。我的意思是,X,Y 对(每个 Id 的类型相反)是最短的欧氏距离。

第一行示例:距离 (73.91, 34.84) 最近的(B 型)对是 (73.35,38.83) 对 - 其欧氏距离为 4.03。

一种(可能!?)方式是构造10列-每个Id中点之间的欧式距离,然后从相反的Type中选择最小的欧式距离。不过,我相信会有更快的方法。

最佳答案

对于快速(编码)解决方案,我们可以在 groupby 上使用 apply:

from scipy.spatial import distance_matrix

def get_min_dist(x):
    # compute distance matrix
    tmp = distance_matrix(x.iloc[:5], x.iloc[5:])

    # get index min of corresponding types
    idx = np.concatenate((np.argmin(tmp,1)+5),  # type A to type B
                          np.argmin(tmp, 0)     # type B to type A
                        )

    return pd.DataFrame(x.iloc[idx].values, 
                        index=x.index, 
                        columns=[a+'_closest' for a in x.columns])

df.groupby('Id')[['X','Y']].apply(get_min_dist)

输出:

    X_closest  Y_closest
0       73.35      38.83
1       73.35      38.83
2       73.35      38.83
3       75.06      24.00
4       73.35      38.83
5       71.46      27.70
6       71.46      27.70
7       71.46      27.70
8       71.46      27.70
9       73.91      34.84
10      74.60      31.88
11      74.70      19.19
12      74.60      31.88
13      74.60      31.88
14      79.76      29.49
15      75.43      32.41
16      74.78      33.21
17      75.82      17.56
18      75.43      32.41
19      75.43      32.41

关于python - 在 Pandas 数据框中计算点之间最短(欧几里得)距离的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58768373/

相关文章:

python - AWS Glue python 安装 - 找不到版本

python - 函数参数 - Python

python - 使用 StyleFrame 从 Excel 读取

python - Pandas 命令不起作用 - 为什么? (例如 : df. drop(...))

python - 计算两个 3D 数组之间的元素级欧氏距离

python - 为什么 Keras Conv1D 层的输出张量没有输入维度?

使用 Beaglebone Black Angstrom 通过半双工 RS-485 分线板实现自动 RTS 的 Python PySerial

python - Pandas 聚合然后得到组平均值

python - 无法将值列表解析为字符串列表

python - 裁剪图像为3D阵列