执行复杂功能后创建新的pandas数据帧

时间:2017-06-02 00:18:03

标签: python pandas numpy dataframe

我在以下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是两个trajs。

这是该方法的工作方式:

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

method_dist(x, y)

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

由于我的df中有100行,我想尽可能自动执行此过程。

如果我给出一个索引列表[0,1,3], 我想创建一个函数或循环,它计算索引0和索引1之间的轨迹之间的距离;然后是索引0和3,然后是1和3;直到计算出每对之间的距离,并且我想将dist存储在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中的轨迹对。

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

由于

1 个答案:

答案 0 :(得分:1)

制作自定义class,将减法定义为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]])