2015-11-07 78 views
0

假設我有一個數據幀我可以在數據幀上的行之間執行操作嗎?

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

是否存在多行數據爲每個ID1,ID2對?換句話說,x和y隨時間而變化? – paisanco

+0

是的,這是正確的。對於任意ID1,ID2對,至少有一行。如果有多個,那麼x,y會隨着時間而改變。 – user3600497

+0

可能是這樣做的複雜方式,但你可以'groupby' ID1和ID2;然後*遍歷組*壓縮(使用'zip')''''和'y'到一個'xy'列,其中的值是點(x,y)。然後,將這個'xy'列移動1(使用'shift'),得到一個新的列'xyshift'。然後在這個「xyshift」列中的行軸上應用差分函數;並最終將它迭代地合併到你的數據框中或組成一個新的 – vmg

回答

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 
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,那麼這意味着該成員已經移動其他成員沒有的明智。

您可以通過使用diff功能,這將產生na的第一列計算xy之間的差異,但你可以很容易地使用dropna功能刪除它。

然後計算矢量長度可以很容易地使用該函數np.linalg.norm

也可以使用x.diff().iloc[1]代替x.diff().dropna()

+0

這是一個不錯的解決方案,但我不想每個成員的總行程。我反而想要在每個時間步移動的距離。 – user3600497

+0

這更容易,你可以使用'df [['x','y']]。apply(lambda x:np.linalg.norm(x),axis = 1)' –

相關問題