python - 集計 - 特定の列でグループ化されたアイテム間の平均時間差の計算



この列は集計関数または group by 句に含まれていません。 (1)

次のアプローチを検討してください。

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

いくつかの説明:

最初に、DFをtime列でソートします。そうでなければ、マイナスの差があるかもしれません。

その後、 timedelta64[ns] useridごとにグループ化し、グループごとに連続するすべての行の時間差を計算します(ソート済み)。これにより、 timedelta64[ns]timedelta64[ns]を持つ一連のtimedelta64[ns] dtypeが.dt.secondsます。

.dt.seconds.mean()を使用すると、各グループの平均を計算できます

更新:

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

私は以下のデータフレームを持っています:

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

これを達成するには、各ユーザーを巡回させ、平均時間差を1つずつ計算する必要がありますか? または、同じ結果を達成するためのより速い方法がありますか?





group-by