嗯,我有以下几列:
Id PlayId X Y
0 0 2.3 3.4
1 0 5.4 3.2
2 1 3.2 5.1
3 1 4.2 1.7
如果我将两行按一个PlayId分组,则我想添加两列距离和角度:
Id PlayId X Y Distance_0 Distance_1 Angle_0 Angle_1
0 0 2.3 3.4 0.0 ? 0.0 ?
1 0 5.4 3.2 ? 0.0 ? 0.0
2 1 3.2 5.1
3 1 4.2 1.7
每个距离列描述一个组中第i个元素和第j个元素之间的欧几里得距离:
dist(x0, x1, y0, y1) = sqrt((x0 - x1) ** 2 + (y0 - y1) ** 2)
以类似的方式,计算第i个元素和第j个元素之间的角度。
那么,如何在不逐个处理元素的情况下有效地执行此操作?
答案 0 :(得分:1)
您可以使用SciPy的pdist
函数计算成对距离:
df = pd.DataFrame({'X': [5, 6, 7], 'Y': [3, 4, 5]})
# df
# X Y
# 0 5 3
# 1 6 4
# 2 7 5
from scipy.spatial.distance import pdist, squareform
cols = [f'Distance_{i}' for i in range(len(df))]
pd.DataFrame(squareform(pdist(df.values)), columns=cols)
产生以下DataFrame:
Distance_0 Distance_1 Distance_2
0 0.000000 1.638991 2.828427
1 1.638991 0.000000 1.638991
2 2.828427 1.638991 0.000000
这是可行的,因为pdist
采用大小为m * n的数组,其中m是观测值的数量(=行),n是所述观测值的维数(在这种情况下:两个-X和Y)
随后,您可以根据需要(使用pd.concat
)将原始DataFrame与新创建的DataFrame合并。
对于角度,也可以使用pdist
,也可以使用metric='cosine'
计算余弦距离。有关更多信息,请参见this post。