簡體   English   中英

在使用pandas時,是否有另一種方法可以將列添加到groupby中?

[英]Is there another way to add a column to a groupby when using pandas?

我將一個會話定義為一組播放中沒有至少15分鍾休息的歌曲。 我的目標是找到每個用戶的平均會話長度。

到目前為止,我已經使用python和pandas按用戶ID對下面的數據進行分組,然后按開始時間戳對每個組進行排序。

輸入數據:

在此輸入圖像描述

我的代碼到目前為止:

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

上述代碼的輸出:

在此輸入圖像描述

接下來我想計算第一首歌曲的結束時間戳和下一張時間戳的開頭之間的中斷。

但是,這不起作用:

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?

您可以使用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

更新

要獲得平均會話持續時間,您可以這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM