2017-05-27 61 views
2

我有以下數據框:計算由特定的列分組的項目之間的平均時間差

userid | time  
1  22.01.2001 13:00 
1  22.01.2001 13:05 
1  22.01.2001 13:07 
2  22.01.2001 14:00 
2  22.01.2001 14:04 
2  22.01.2001 13:05 
2  22.01.2001 13:06 
3  22.01.2001 13:20 
3  22.01.2001 13:22 
4  22.01.2001 13:37 

我想獲得每用戶存儲的連續行爲之間的平均時間差新列:

userid | avg_time_diff 
1  3.5 #(5 + 2)/2 
2  2  #(4 + 1 + 1)/3 
3  2 
4  0 

要做到這一點,我需要循環低谷每個用戶,並逐一計算平均時差嗎?或者,有沒有更快的方法來達到同樣的結果?

回答

2

考慮以下方法:

In [84]: df.sort_values('time').groupby('userid')['time'] \ 
      .apply(lambda x: x.diff().dt.seconds.mean()/60) 
Out[84]: 
userid 
1  3.500000 
2 19.666667 
3  2.000000 
4   NaN 
Name: time, dtype: float64 

幾點說明:

首先我們time列進行排序的DF,否則,我們可能有負差。

然後,我們通過組和userid每個我們計算所有連續行(排序)的時間差組 - 這將產生timedelta64[ns] D型細胞的系列,其具有.dt.seconds存取器。

使用.dt.seconds.mean()我們可以計算出平均每個組

UPDATE:

取均值比僅是小於60 分鐘

In [122]: threshold = 60 
    ...: 
    ...: (df.sort_values('time').groupby('userid')['time'] 
    ...: .apply(lambda x: (x.diff().dt.seconds/60) 
    ...:      .to_frame('diff') 
    ...:      .query("diff < @threshold")['diff'].mean())) 
    ...: 
Out[122]: 
userid 
1  3.500000 
2 19.666667 
3  2.000000 
4   NaN 
Name: time, dtype: float64 
+0

的差異謝謝。請問lambda中'x'的類型是什麼?這是一系列日期嗎?如果是這樣,'.diff()'的結果是什麼?我很感激,如果你可以提供更多的細節,以便下次我可以自己做:) – renakre

+0

@renakre,當然!你可以這樣檢查:'df.groupby('userid')['time']。apply(lambda x:print(x.dtypes))'或'df.groupby('userid')['time'] .apply(lambda x:print(type(x)))' – MaxU

+1

@renakre,我已經添加了解釋 – MaxU