如何在Python中计算多个连续点中,分组两个点之间的距离?

4
我有以下的df
       id             xx            yy  time
0       1  553343.041098  4.178420e+06     1
1       1  553343.069815  4.178415e+06     2
2       1  553343.069815  4.178415e+06     3
3       2  553343.950755  4.178415e+06     1
4       2  553341.343829  4.178410e+06     6
xxyy分别是每个id在某一时刻的位置。我想在这个df中创建一个额外的列,它将是在id组内从一个时间点到另一个时间点的距离差(从time的最小值到下一个更大的值,再到下一个更大的值等)。是否有Pythonic的方法来实现这个?

3
你期望得到什么结果?你尝试过什么?能否分享生成示例数据框的代码? - Javier Lopez Tomas
@JavierLópezTomás 不清楚预期结果应该是什么?您也可以使用 pd.read_clipboard() 来获取示例 df - quant
@quant “不清楚期望结果应该是什么” - 如果清楚的话,就不会有人要求澄清了。你应该始终为你的样本数据包括期望输出,以帮助回答者更好地理解你的需求,而不必猜测。 - Dan
3个回答

2
你可以按照以下方式操作。
我没有对df['distance_meters']进行处理,因为它很简单。
df['xx_diff']=df.groupby('id')['xx'].diff()**2
df['yy_diff']=df.groupby('id')['yy'].diff()**2

如果您不需要数据框中的 ['xx_diff'] 和 ['yy_diff'] 列,您可以直接使用以下代码。
df['distance']= np.sqrt(df.groupby('id')['xx'].diff()**2+df.groupby('id')['yy'].diff()**2)

输出

    id            xx         yy time    xx_diff3    yy_diff3    distance
0   1   553343.041098   4178420.0   1   NaN            NaN      NaN
1   1   553343.069815   4178415.0   2   0.000825       25.0     5.000082
2   1   553343.069815   4178415.0   3   0.000000       0.0      0.000000
3   2   553343.950755   4178415.0   1   NaN            NaN      NaN
4   2   553341.343829   4178410.0   6   6.796063      25.0      5.638800

0

我不知道是否有更有效的方法来解决这个问题,但这是一个解决方案:

import numpy as np
df['xx_diff'] = df.groupby('id')['xx'].rolling(window=2).apply(lambda x: (x[1] - x[0])**2).reset_index(drop=True)
df['yy_diff'] = df.groupby('id')['yy'].rolling(window=2).apply(lambda x: (x[1] - x[0])**2).reset_index(drop=True)
df['distance_meters'] = np.sqrt(df['xx_diff'] + df['yy_diff'])

更符合 Python 风格的答案将被接受 :)

2
为什么不把这个作为你问题的一部分呢?这样可以展示你已经尝试过什么,也可以避免别人做出相同的建议。 - Dan

0

试试这个:

import pandas as pd
import math

def calc_distance(values):
    values.sort_values('id', inplace = True)
    values['distance_diff'] = 0
    values.reset_index(drop=True, inplace=True)
    for i in range(values.shape[0]-1):
        p1 = list(values.loc[i, ['xx', 'yy']])
        p2 = list(values.loc[i+1, ['xx', 'yy']])
        values.loc[i,'distance_diff'] = math.sqrt( ((p1[0]-p2[0])**2)+((p1[1]-p2[1])**2))
    return values

lt = []
lt.append(df.groupby(['id']).apply(calc_distance))
print(pd.concat(lt, ignore_index=True))

输出:

   id             xx         yy  time  distance_diff
0   1  553343.041098  4178420.0     1       5.000082
1   1  553343.069815  4178415.0     2       0.000000
2   1  553343.069815  4178415.0     3       0.000000
3   2  553343.950755  4178415.0     1       5.638800
4   2  553341.343829  4178410.0     6       0.000000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接