2017-10-23 5 views
1

オンラインコースを受講しているユーザーに関するデータセットがあります。それは、 'id'、 'event'、 'time'のような機能を持っています。私はそれらをグループ化し、特定の日に各イベントを行っているユーザーの頻度を知りたい。私は数日で数えたい。日付の時刻を変換する方法とPythonの日数をカウントするには?

lt = log_train.groupby(['enrollment_id','event','time']).size() 
print(lt) 


enrollment_id event  time 
1    access 2014-06-14T09:38:39 2 
         2014-06-14T09:38:48 1 
         2014-06-19T06:21:16 2 
         2014-06-19T06:21:32 1 
         2014-06-19T06:21:45 1 
              .. 
200887  navigate 2014-07-24T03:27:16 1 
200887  navigate 2014-07-24T03:27:16 1 
      page_close 2014-07-24T04:19:55 1 
      video  2014-07-24T04:19:57 1 
200888  access  2014-07-24T03:48:14 2 
      discussion 2014-07-24T03:47:57 1 
      navigate 2014-07-24T03:47:17 1 
         2014-07-24T03:47:28 1 
         2014-07-24T03:48:01 1 

私が他のデータセットで見た情報から、userIDs、courseIDs、およびコースの範囲時間があります。

usercourse = pd.merge(enroll,date,how="left", on= 'course_id') 



enrollment_id       username \ 

0     1 9Uee7oEuuMmgPx2IzPfFkWgkHZyPbWr0 
1     3 1qXC7Fjbwp66GPQc6pHLfEuO8WKozxG4 
2     4 FIHlppZyoq8muPbdVxS44gfvceX9zvU7 

          course_id  from   to 
0  DPnLzkJJqOOPRJfBxIHbQEERiYHu5ila 2014-06-12 2014-07-11 
1  7GRhBDsirIGkRZBtSMEzNTyDr2JQm4xx 2014-06-19 2014-07-18 
2  DPnLzkJJqOOPRJfBxIHbQEERiYHu5ila 2014-06-12 2014-07-11 

すべてのユーザーは1つのコースしかなく、すべてのコースには30日で同じ範囲があります。だから私は、すべてのコース異なる日付から開始

enrollment_id event  #ofDays #ofActionTimes 
1    access  2   2 
          10  6 
          30  2 
            .. 
200887   navigate 23  1 
       page_close 30  1 
       video  1   1 
200888   access  12  2 
       discussion 2   1 
       navigate 5   3 
          29  4 

**#ofDays means at the Nth day of a course. 
#ofActionTimes means how often an event happens on the Nth day.** 

ので、このような類似しているはずが欲しいものを私はどのようにPythonの上でこのデータ形式を生成するには考えています。
問題を解決するために誰かが私を助けてくれることを願っています!

+0

'time'と' frequency'は何ですか?あなたのサンプル出力を構築するために使用できる 'usercourse'データを提供できますか? –

+0

こんにちは@andrew_reece、私は最後のコードの最後に説明を更新しました。 –

答えて

0

IIUCの場合は、merge,groupby、およびcountを使用して必要な情報を取得できます。

まず、いくつかの例のデータ。これはあなたが提供したデータに基づいていますが、出発データから出力を明確に追跡できるように変更しました。

data1 = {"enrollment_id":[1,1,1,1,2,2,3,3,3], 
     "event":["access","access","access","navigate","access", 
        "page_close","navigate","navigate","video"], 
     "time":["2014-06-14T09:38:39", "2014-06-14T09:38:48", 
       "2014-06-19T06:21:16", "2014-06-19T06:21:32", 
       "2014-06-21T06:21:45", "2014-06-22T06:21:16", 
       "2014-06-19T06:21:32", "2014-06-20T06:21:16", 
       "2014-06-20T06:21:16"]} 

data2 = {"enrollment_id":[1,2,3], 
     "username":["user1", "user2", "user3"], 
     "course_id":["course1", "course2", "course3"], 
     "course_from":["2014-06-12", "2014-06-19", "2014-06-12"], 
     "course_to":["2014-07-11", "2014-07-18", "2014-07-11"]} 

df1 = pd.DataFrame(data1) 
df1 
    enrollment_id  event     time 
0    1  access 2014-06-14T09:38:39 
1    1  access 2014-06-14T09:38:48 
2    1  access 2014-06-19T06:21:16 
3    1 navigate 2014-06-19T06:21:32 
4    2  access 2014-06-21T06:21:45 
5    2 page_close 2014-06-22T06:21:16 
6    3 navigate 2014-06-19T06:21:32 
7    3 navigate 2014-06-20T06:21:16 
8    3  video 2014-06-20T06:21:16 

df2 = pd.DataFrame(data2) 
df2 
    course_id enrollment_id course_from course_to username 
0 course1    1 2014-06-12 2014-07-11 user1 
1 course2    2 2014-06-19 2014-07-18 user2 
2 course3    3 2014-06-12 2014-07-11 user3 

我々は、特定のeventはもちろんの日ごとに別々のカウントは、特定の​​のために起こった回数を知りたいです。

(コースの開始日)をevent_dateから引いて、コースの日番号course_day_numを得ます。

その後
df = (df1.merge(df2[["enrollment_id", "course_from"]], 
      on="enrollment_id", how="left") 
) 
df["event_date"] = pd.to_datetime(pd.to_datetime(df1.time).dt.date) 
df["course_from"] = pd.to_datetime(df["course_from"]) 
df["course_day_num"] = (df.event_date - df["course_from"]).dt.days 

groupbycourse_day_numもちろんにつき一日、一人当たり、イベントカウントを取得する:

groupby_cols = ["enrollment_id", "event", "event_date", "course_day_num"] 

df.groupby(groupby_cols).event_date.count() 

enrollment_id event  event_date course_day_num 
1    access  2014-06-14 2     2 
          2014-06-19 7     1 
       navigate 2014-06-19 7     1 
2    access  2014-06-21 2     1 
       page_close 2014-06-22 3     1 
3    navigate 2014-06-19 7     1 
          2014-06-20 8     1 
       video  2014-06-20 8     1 
Name: event_date, dtype: int64 
+0

もう一度@andrew_reece、ここに投稿された私の新しい質問を見てもらえますか? https://stackoverflow.com/questions/46988238/how-to-fill-0-and-nan-for-a-dataframe-after-groupby-it-in-python誰も私に手を差し伸べることはできないようだ:( –

関連する問題