假设我有一个数据框
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,即距离矩阵的计算距离。
这看起来效率很低。有没有更好的方法可以用数据帧做到这一点?
答案 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
函数计算y
和diff
之间的差异,该函数会为第一列生成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