根据分组数据创建新列

时间:2019-11-20 11:56:02

标签: python python-3.x pandas pandas-groupby

我的熊猫数据框如下-

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时间戳记),现在为id   1和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)

1 个答案:

答案 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