gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:01:35 25 4
gpt4 key购买 nike

考虑以下 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com