2016-12-29 11 views
3

セッションを、少なくとも15分の休憩を持たない再生曲のセットとして定義しました。私の目標は、各ユーザーの平均セッション長を見つけることです。パンダを使用するときにグループに列を追加する別の方法はありますか?

これまでのところ、私はpythonとpandasを使用して、以下のデータをユーザーIDでグループ化し、それらのグループのそれぞれを開始タイムスタンプでソートしました。

入力データ:これまでに

enter image description here

マイコード:私は間に休憩を計算したい

enter image description here

次へ:上記のコードの

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

出力tの終了タイムスタンプ彼は最初の曲と次のタイムスタンプの開始。

しかし、これは動作しません:

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:ラムダが割り当て

を含めることはできませんがGROUPBYに列を追加するための別の方法はありますか?

+0

実際のデータはなり便利です – piRSquared

答えて

1

あなたは「島の歌を得るために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 
+0

あなたの助けていただきありがとうございます!上記は非常に役に立ちます。もう1つの質問 - 各ユーザーのセッションごとに合計時間を見つけ、パンダを使って平均を見つける方法はありますか?たとえば、ユーザー1の場合、0番目のセッションの長さは3分、1番目のセッションの長さは7分なので、平均は10/2 = 5です。私はパンダにあまり慣れていないし、Pythonを使って各行をループする以外にどうやってアプローチするのか分かりません。 – pr338

+0

@ pr338はい、更新を参照してください –