gpt4 book ai didi

python - 使用 Pandas 时,还有另一种方法可以将列添加到 groupby 吗?

转载 作者:行者123 更新时间:2023-11-28 18:26:08 25 4
gpt4 key购买 nike

我将 session 定义为播放的一组歌曲,其中没有至少 15 分钟的休息时间。我的目标是找到每个用户的平均 session 长度。

到目前为止,我已经使用 python 和 pandas 按用户 ID 对以下数据进行分组,然后按开始时间戳对每个组进行排序。

输入数据:

enter image description here

到目前为止我的代码:

start_end_song.groupby('user_id').apply(lambda x: x.sort_values('start_timestamp'))

以上代码的输出:

enter image description here

接下来我想计算第一首歌曲的结束时间戳和下一首时间戳的开始之间的间隔。

但是,这不起作用:

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))

语法错误:lambda 不能包含赋值

还有其他方法可以将列添加到 groupby 吗?

最佳答案

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

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

更新

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

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

关于python - 使用 Pandas 时,还有另一种方法可以将列添加到 groupby 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com