我的熊猫数据框如下-
id session_id timestamp url
1 #123 1 a.com
1 #123 2 a.com
1 #123 3 b.com
1 #123 4 b.com
1 #123 5 a.com
1 #546 37 c.com
2 #342 78 b.com
2 #674 79 c.com
我想先使用id
然后再使用session_id
对所有数据进行分组,并计算出每个网址的总花费时间。
制作DataFrame的代码-
pd.DataFrame({
'id':[1, 1, 1, 1, 1, 1, 2, 2],
'session_id':['#123', '#123', '#123', '#123', '#123', '#546', '#342', '#674'],
'url':['a.com', 'a.com', 'b.com', 'b.com', 'a.com', 'c.com', 'b.com', 'c.com'],
'timestamp':[1,2,3,4,5,37,78,79]
})
时间消耗计算为
2(timestamp)-1(timestamp)=1
(实际数据的时间戳记为UNIX时间戳记),现在为id1
和session_id#123
-a.com
的总花费为(2-1)+(5-4)= 2(因为3,4时间戳用于b.com
)
预期输出-
id session_id timestamp url total_time
1 #123 1 a.com 2
1 #123 2 a.com 2
1 #123 3 b.com 2
1 #123 4 b.com 2
1 #123 5 a.com 2
1 #546 37 c.com 0
2 #342 78 b.com 0
2 #674 79 c.com 0
此处的网址时间会广播到该网址的所有行中(根据id和session_id)
答案 0 :(得分:0)
您可以首先计算每个会话中每个条目的时差,并将其存储在新列time_diff中:
df['time_diff'] = df.groupby(['id', 'session_id']).diff().fillna(0)
然后,对于会话中的每个网址,您可以将花费在该网址上的时间相加:
df['total_time'] = df.groupby(['id', 'session_id', 'url'])['time_diff'].transform('sum')
这将导致以下输出:
id session_id url timestamp time_diff total
0 1 #123 a.com 1 0.0 2.0
1 1 #123 a.com 2 1.0 2.0
2 1 #123 b.com 3 0.0 2.0
3 1 #123 b.com 4 1.0 2.0
4 1 #123 a.com 5 1.0 2.0
5 1 #546 c.com 37 0.0 0.0
6 2 #342 b.com 78 0.0 0.0
7 2 #674 c.com 79 0.0 0.0