我可以在数据帧的行之间执行操作吗?

时间:2015-11-07 01:44:17

标签: python numpy pandas dataframe

假设我有一个数据框

   ID1  ID2 x             y          time
0   0   1   34.337735   -76.3319716667  1446797582
1   0   1   34.3841816667   -76.2837666667  1446796183
2   0   2   34.49157    -76.1661133333  1446792969
3   0   3   34.5275266667   -76.1151866667  1446791765
4   0   3   34.5624816667   -76.0633883333  1446790559

我想要的是捕捉每个成员移动的距离,由ID1,ID2对唯一识别。

无论如何我可以在数据帧上执行行操作吗?我最初的想法是使用df.as_matrix()将数据帧转换为矩阵,挑选出唯一的ID,即距离矩阵的计算距离。

这看起来效率很低。有没有更好的方法可以用数据帧做到这一点?

2 个答案:

答案 0 :(得分:1)

如果您想计算每个时间步的距离,您可以执行以下操作

df[['x' , 'y']].apply(lambda x : np.linalg.norm(x) , axis = 1 )

另一方面,如果您想计算每个成员的距离,您可以执行以下操作

In [38]:
df.groupby([df.ID1 , df.ID2])[['x' , 'y']].
apply(lambda x : np.linalg.norm(x.diff().dropna())  if len(x) > 1 else 0 )
Out[38]:
ID1  ID2
0    1      0.066940
     2      0.000000
     3      0.062489
dtype: float64

首先,您将按ID列进行分组,然后检查成员长度是否长度大于1,这意味着该成员已经移动了其他成员没有。

您可以使用x函数计算ydiff之间的差异,该函数会为第一列生成na,但您可以使用{{{{}}轻松删除它1}}功能。

然后计算矢量长度,您可以轻松使用函数dropna

您也可以使用np.linalg.norm代替x.diff().iloc[1]

答案 1 :(得分:0)

如果您需要获得每个唯一对的总路径长度

pd.DataFrame(df.groupby(['ID1','ID2']).apply(lambda z:pathlength(z.x.values,z.y.values)))

pathlength

的位置
from math import sqrt
def pathlength(x,y):
    n = len(x) 
    lv = [sqrt((x[i]-x[i-1])**2 + (y[i]-y[i-1])**2) for i in range (1,n)]
    L = sum(lv)
    return L

这给了我们

    0
ID1 ID2 
0   1   0.066940
    2   0.000000
    3   0.062489