代码之家  ›  专栏  ›  技术社区  ›  user3415167

在groupby中将下一行的列值添加到当前行的更快方法

  •  0
  • user3415167  · 技术社区  · 4 年前

    我正在尝试将下一行的列值添加到中的当前行 groupby .

    groupby_event_data = event_data.groupby(["user_id", "course_id", "lecture_id"])
    pause_event_data = pd.DataFrame(columns=['real_time', 'next_real_time'])
    n = 0
    for each_group, eachdf in groupby_event_data:
        idx = 0
        for index, row in eachdf.iterrows():
            if row['event_from']=='pause_video':
                if idx < len(eachdf)-1:
                    pause_event_data.loc[n] = [row.real_time, eachdf.iloc[idx+1]['real_time']] 
                else:
                    pause_event_data.loc[n] = [row.real_time, None] 
                n = n+1
            idx = idx + 1
    

    例如,下面的示例 event_data :

     event_data:
          user_id  course_id  lecture_id  event_from   real_time
        0    a        c1          l1      pause_video  2018-07-24T19:44:25.869279+00:00
        1    a        c1          l1      pause_video  2018-07-24T19:46:25.869279+00:00    
        2    a        c2          l1      pause_video  2018-07-24T19:47:25.869279+00:00
        3    b        c2          l1      pause_video  2018-07-24T19:45:25.869279+00:00
        4    b        c2          l1      pause_video  2018-07-24T19:50:25.869279+00:00
        5    a        c2          l1      play_video   2018-07-24T19:52:25.869279+00:00
        6    a        c1          l1      pause_video  2018-07-24T19:54:25.869279+00:00
    

    我想看看下面 pause_event_data :

     pause_event_data:
           real_time                           next_real_time
        0  2018-07-24T19:44:25.869279+00:00   2018-07-24T19:46:25.869279+00:00
        1  2018-07-24T19:46:25.869279+00:00   2018-07-24T19:54:25.869279+00:00
        2  2018-07-24T19:47:25.869279+00:00   2018-07-24T19:52:25.869279+00:00
        3  2018-07-24T19:45:25.869279+00:00   2018-07-24T19:50:25.869279+00:00
        4  2018-07-24T19:50:25.869279+00:00   None
        5  2018-07-24T19:54:25.869279+00:00   None
    

    事件数据

    所以我想知道有没有更快捷的方法。

    提前谢谢你的帮助!

    0 回复  |  直到 4 年前
        1
  •  1
  •   jezrael    4 年前

    使用 DataFrameGroupBy.shift pause_video :

    cols = ["user_id", "course_id", "lecture_id"]
    event_data['next_real_time'] = event_data.groupby(cols)['real_time'].shift(-1)
    mask = event_data['event_from'].eq('pause_video')
    event_data = (event_data.sort_values(cols)
                            .loc[mask, ['real_time','next_real_time']])
    print (event_data)
                             real_time             next_real_time
    0 2018-07-24 19:44:25.869279+00:00 2018-07-24 19:46:25.869279
    1 2018-07-24 19:46:25.869279+00:00 2018-07-24 19:54:25.869279
    6 2018-07-24 19:54:25.869279+00:00                        NaT
    2 2018-07-24 19:47:25.869279+00:00 2018-07-24 19:52:25.869279
    3 2018-07-24 19:45:25.869279+00:00 2018-07-24 19:50:25.869279
    4 2018-07-24 19:50:25.869279+00:00                        NaT
    

    原始解决方案:

    groupby_event_data = event_data.groupby(["user_id", "course_id", "lecture_id"])
    pause_event_data = pd.DataFrame(columns=['real_time', 'next_real_time'])
    n = 0
    for each_group, eachdf in groupby_event_data:
        idx = 0
        for index, row in eachdf.iterrows():
            if row['event_from']=='pause_video':
                if idx < len(eachdf)-1:
                    pause_event_data.loc[n] = [row.real_time, eachdf.iloc[idx+1]['real_time']] 
                else:
                    pause_event_data.loc[n] = [row.real_time, None] 
                n = n+1
            idx = idx + 1
    print (pause_event_data)
                       real_time             next_real_time
    0 2018-07-24 19:44:25.869279 2018-07-24 19:46:25.869279
    1 2018-07-24 19:46:25.869279 2018-07-24 19:54:25.869279
    2 2018-07-24 19:54:25.869279                        NaT
    3 2018-07-24 19:47:25.869279 2018-07-24 19:52:25.869279
    4 2018-07-24 19:45:25.869279 2018-07-24 19:50:25.869279
    5 2018-07-24 19:50:25.869279                        NaT       
    
        2
  •  2
  •   Valdi_Bo    4 年前

    转移 (参见文档)。你也可以用在 子句 .

    在您的情况下,您可以运行以下命令,而不是循环:

    pause_event_data = event_data[['real_time']].copy()
    pause_event_data['next_real_time'] = event_data.groupby(
        ["user_id", "course_id", "lecture_id"]).real_time.shift(-1)
    

    实时