考虑以下 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 的最小欧几里德距离。不过,我确信会有更快的方法。
对于快速(编码)解决方案,我们可以使用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)
Output:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)