首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在使用熊猫时,是否有其他方式向群中添加列?

在使用熊猫时,是否有其他方式向群中添加列?
EN

Stack Overflow用户
提问于 2016-12-29 23:17:08
回答 1查看 179关注 0票数 4

我把会话定义为一组歌曲,这些歌曲播放的时间不超过15分钟。我的目标是找到每个用户的平均会话长度。

到目前为止,我已经使用python和大熊猫将下面的数据按用户id分组,然后按照开始时间戳对每个组进行排序。

输入数据:

到目前为止我的代码是:

代码语言:javascript
代码运行次数:0
运行
复制
start_end_song.groupby('user_id').apply(lambda x: x.sort_values('start_timestamp'))

上述代码的输出:

接下来,我要计算第一首歌的结束时间戳和下一首时间戳的开头之间的间隔。

然而,这是行不通的:

代码语言:javascript
代码运行次数:0
运行
复制
start_end_song.groupby('user_id')\
.apply(lambda x: x.sort_values('start_timestamp'))\
.apply(lambda x: x['break']= start_end_song['end_timestamp']- start_end_song['start_timestamp'].shift(-1))

SyntaxError: lambda不能包含赋值

是否有另一种方式向groupby添加列?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-29 23:34:33

您可以使用pandas.DataFrame.shiftpandas.DataFrame.cumsum获得“岛屿”歌曲:

代码语言:javascript
代码运行次数:0
运行
复制
>>> df = pd.DataFrame({'user_id': [1, 1, 1, 1, 2, 2, 2, 2], 'start_timestamp': [1, 3, 20, 26, 1, 5, 40, 42], 'end_timestamp': [2, 4, 25, 27, 2, 10, 41, 50]}, columns=['user_id', 'start_timestamp', 'end_timestamp'])
>>> df
   user_id  start_timestamp  end_timestamp
0        1                1              2
1        1                3              4
2        1               20             25
3        1               26             27
4        2                1              2
5        2                5             10
6        2               40             41
7        2               42             50

>>> df['session_break'] = (df['start_timestamp'] - df.groupby('user_id')['end_timestamp'].shift(1) >= 15).astype('int')
>>> df
   user_id  start_timestamp  end_timestamp  session_break
0        1                1              2              0
1        1                3              4              0
2        1               20             25              1
3        1               26             27              0
4        2                1              2              0
5        2                5             10              0
6        2               40             41              1
7        2               42             50              0
>>> df['session_label'] = df.groupby('user_id')['session_break'].cumsum()
>>> df
   user_id  start_timestamp  end_timestamp  session_break  session_label
0        1                1              2              0              0
1        1                3              4              0              0
2        1               20             25              1              1
3        1               26             27              0              1
4        2                1              2              0              0
5        2                5             10              0              0
6        2               40             41              1              1
7        2               42             50              0              1

更新

要获得平均会话持续时间,可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
>>> g = df.groupby(['user_id', 'session_label']).agg({'end_timestamp' : np.max, 'start_timestamp' : np.min})
>>> g
                       start_timestamp  end_timestamp
user_id session_label                                
1       0                            1              4
        1                           20             27
2       0                            1             10
        1                           40             50

>>> (g['end_timestamp'] - g['start_timestamp']).groupby(level=0).mean()
user_id
1    5.0
2    9.5
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41388537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档