<p>使用Pandas的一种可能解决方案:我使用Pandas groupby shift匹配坐标,计算距离,然后对组中的距离求和:</p>
<pre><code>import math
import numpy as np
import pandas as pd
def distance(row):
x1, y1, x2, y2 = row["X_COORDINATES"], row["Y_COORDINATES"], row["X2"], row["Y2"]
if np.isnan(x2) or np.isnan(y2):
return 0
return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
df["X2"] = df.groupby("trackiD")["X_COORDINATES"].shift(-1)
df["Y2"] = df.groupby("trackiD")["Y_COORDINATES"].shift(-1)
df["distance"] = df.apply(distance, axis=1)
df.groupby("trackiD")["distance"].sum()
</code></pre>
<p>输出:</p>
<pre><code>trackiD
2 6.560621
3 2.345185
4 1.868628
Name: distance, dtype: float64
</code></pre>
<p>测试数据帧:</p>
<pre><code>df = pd.DataFrame(
{
"trackiD": {
0: 2,
1: 2,
2: 2,
3: 2,
4: 2,
5: 2,
6: 2,
7: 2,
8: 2,
9: 3,
10: 3,
11: 3,
12: 3,
13: 3,
14: 4,
15: 4,
16: 4,
17: 4,
},
"X_COORDINATES": {
0: 542.299805,
1: 544.108215,
2: 545.300598,
3: 546.417053,
4: 546.198669,
5: 546.724915,
6: 547.037048,
7: 547.011963,
8: 547.649231,
9: 547.600525,
10: 547.891479,
11: 548.580505,
12: 548.144409,
13: 548.62677,
14: 548.527222,
15: 548.504211,
16: 548.936584,
17: 548.627869,
},
"Y_COORDINATES": {
0: 23.38809,
1: 23.575758,
2: 23.962421,
3: 25.049328,
4: 24.830357,
5: 24.916084,
6: 24.918982,
7: 24.785202,
8: 24.845772,
9: 24.613401,
10: 24.268734,
11: 24.459103,
12: 23.915531,
13: 23.922005,
14: 24.13467,
15: 23.642254,
16: 24.028818,
17: 23.295454,
},
}
)
</code></pre>