熊猫:计算分组的X,Y之间的距离和角度

时间:2019-10-22 10:49:04

标签: python pandas

嗯,我有以下几列:

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个元素之间的角度。

那么,如何在不逐个处理元素的情况下有效地执行此操作?

1 个答案:

答案 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

相关问题