【问题标题】:Pandas: Calculate Distance and Angle between X, Y groupped熊猫:计算X,Y分组之间的距离和角度
【发布时间】:2019-10-22 22:02:15
【问题描述】:

嗯,我有以下列:

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

那么,我怎样才能有效地执行此操作,而无需逐个处理元素?

【问题讨论】:

  • hm.. 你的例子中的 x0 和 x1 是什么?
  • 元素的适当坐标:第 i 个元素为 x0,第 j 个元素为 x1。
  • 我不太明白分组情况。你能举一个Distance_0Distance_1中的值的例子吗? X 和 Y 的哪些值用于计算这些距离?
  • 我的意思是 Distance_{i} 表示第 i 个元素与当前元素之间的距离。对于第一个元素,例如,Distance_0 = dist(x0, y0, x0, y0) = 0.0Distance_1 = dist(x0, y0, x1, y1)。对于第二个元素,Distance_0 = dist(x0, y0, x1, y1) Distance_1 = dist(x1, y1, x1, y1) = 0.0
  • 实际上,我们得到一个主对角线为零的距离矩阵。角度矩阵的构造方法相同。

标签: python pandas


【解决方案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)

如果需要,您随后可以将原始 DataFrame 与新创建的 DataFrame 连接起来(使用 pd.concat)。

对于角度,您也可以使用pdist,使用metric='cosine' 来计算余弦距离。请参阅this post 了解更多信息。

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2022-12-06
    • 2017-10-23
    • 2019-06-22
    相关资源
    最近更新 更多