gpt4 book ai didi

python - 执行复杂功能后创建新的 pandas 数据框

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:45 25 4
gpt4 key购买 nike

我有以下 df 中的轨迹数据:

   vid        points
0 0 [[2,4], [5,6], [8,9]]
1 1 [[10,11], [12,13], [14,15]]
2 2 [[1,2], [3,4], [8,1]]
3 3 [[21,10], [8,8], [4,3]]
4 4 [[15,2], [16,1], [17,3]]

每个轨迹都是一个列表点,由 vid 标识。

我有一个函数,它计算两个轨迹之间的距离,让该距离函数为 method_dist(x, y) ; x,y 是两条轨迹。

该方法的工作原理如下:

x = df.iloc[0]["points"].tolist()
y = df.iloc[3]["points"].tolist()

method_dist(x, y)

现在,method_dist 将计算索引 0 和索引 3(不是 vid)处的轨迹之间的距离。

由于我的 df 中有 100 行,因此如果可能的话,我想自动化此过程。

如果我给出一个索引列表 [0, 1, 3],我想创建一个函数或循环来计算索引 0 和索引 1 处轨迹之间的距离;然后对于索引 0 和 3,然后是 1 和 3;直到计算出每对之间的距离,我想将距离存储在 df2 中,如下所示:

注意我们不是计算任何地方的点之间的距离,“点”下的每个单元格都是一个完整的轨迹,函数method_dist正在计算整个轨迹之间的距离。

     traj1_idx       traj2_idx        distance
0 0 1 some_val
1 0 3 some_val
2 1 3 some_val

或者,即使我必须手动计算一对之间的距离,我想创建一个新的 df,每次我采取两条轨迹时,它至少会在新 df 中附加计算出的距离和轨迹对。

请告诉我如何获得预期结果或者我是否需要更改任何内容。

谢谢

最佳答案

创建一个自定义,其中将减法定义为method_dist

def method_dist(x, y):
return abs(x - y)

class Trajectory(object):
def __init__(self, a):
self.data = np.asarray(a)

def __sub__(self, other):
return method_dist(self.data, other.data)

def __repr__(self):
return '☺ {}'.format(self.data.shape)

然后创建一系列这些东西

s = df.points.apply(Trajectory)
s

0 ☺ (3, 2)
1 ☺ (3, 2)
2 ☺ (3, 2)
3 ☺ (3, 2)
4 ☺ (3, 2)
Name: points, dtype: object

定义一个方便的函数来自动执行不同的差异组合

def get_combo_diffs(a, idx):
"""`a` is an array of Trajectory objects. The return
statement shows a slice of `a` minus another slice of `a`.
numpy will execute the underlying objects __sub__ method
for each pair and return an array of the results."""

# this bit just finds all combinations of 2 at a time from `idx`
idx = np.asarray(idx)
n = idx.size
i, j = np.triu_indices(n, 1)

return a[idx[i]] - a[idx[j]]

然后使用它...

get_combo_diffs(s.values, [0, 1, 3])

array([array([[8, 7],
[7, 7],
[6, 6]]),
array([[19, 6],
[ 3, 2],
[ 4, 6]]),
array([[11, 1],
[ 4, 5],
[10, 12]])], dtype=object)

第一个元素

get_combo_diffs(s.values, [0, 1, 3])

array([[8, 7], [7, 7], [6, 6]])

是以下任一结果

first = np.array([[2, 4], [5, 6], [8, 9]])
second = np.array([[10, 11], [12, 13], [14, 15]])

method_dist(first, second)

array([[8, 7],
[7, 7],
[6, 6]])

或者同等的

x, y = s.loc[0], s.loc[1]
x - y

array([[8, 7],
[7, 7],
[6, 6]])

关于python - 执行复杂功能后创建新的 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44318962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com