【问题标题】:Calculate average daily duration for a complete two step process计算完整的两步过程的平均每日持续时间
【发布时间】:2021-12-11 07:24:36
【问题描述】:

我有一个类似于下面的数据框。我想计算特定用户从第 1 步到第 2 步所需的每日平均时间。如果用户重新启动流程(记录为步骤 1),则持续时间将计算为新步骤 1 与后续步骤 2 之间的差异。持续时间仅使用具有步骤 1 和步骤 2 的记录计算同一个用户。

    user    action  time
0   3249    step 1  2021-10-25 19:45:43
1   2160    step 1  2021-10-25 19:48:46
2   2160    step 2  2021-10-25 19:50:21
3   3249    step 2  2021-10-25 19:57:34
4   5120    step 1  2021-10-25 20:30:56
5   3900    step 1  2021-10-25 20:35:40
6   3900    step 1  2021-10-25 20:50:59
7   3900    step 2  2021-10-25 21:15:08

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用pivot_table 转换您的数据框:

    # Use a clean dataframe
    df['time'] = pd.to_datetime(df['time'])
    df = df.sort_values('time')
    
    out = df.pivot_table(index=['user', df['time'].dt.date], columns='action',
                         values='time', aggfunc='last').reset_index()
    
    out['daily_avg'] = out.groupby(['user', 'time'], as_index=False) \
                          .apply(lambda x: x['step 2'] - x['step 1']).values
    
    out = out.groupby('user')['daily_avg'].mean().reset_index()
    

    输出结果:

    >>> out
       user       daily_avg
    0  2160 0 days 00:01:35
    1  3249 0 days 00:11:51
    2  3900 0 days 00:25:03
    3  5120             NaT
    

    我的设置(我稍微修改了你的数据框):

    data = {'user': [3249, 2160, 2160, 3249, 5120, 3900, 3900, 3900, 3900, 3900], 'action': ['step 1', 'step 1', 'step 2', 'step 2', 'step 1', 'step 1', 'step 1', 'step 2', 'step 1', 'step 2'], 'time': ['2021-10-25 19:45:43', '2021-10-25 19:48:46', '2021-10-25 19:50:21', '2021-10-25 19:57:34', '2021-10-25 20:30:56', '2021-10-25 20:35:40', '2021-10-25 20:50:59', '2021-10-25 21:15:08', '2021-10-26 18:23:41', '2021-10-26 18:49:38']}
    
    df = pd.DataFrame(data)
    print(df)
    
    # Output
       user  action                 time
    0  3249  step 1  2021-10-25 19:45:43
    1  2160  step 1  2021-10-25 19:48:46
    2  2160  step 2  2021-10-25 19:50:21
    3  3249  step 2  2021-10-25 19:57:34
    4  5120  step 1  2021-10-25 20:30:56
    5  3900  step 1  2021-10-25 20:35:40
    6  3900  step 1  2021-10-25 20:50:59
    7  3900  step 2  2021-10-25 21:15:08
    8  3900  step 1  2021-10-26 18:23:41  # added
    9  3900  step 2  2021-10-26 18:49:38  # added
    

    【讨论】:

    • 从这里,您当前的输出是什么?你需要按天分组吗?
    • 是的,我想知道完成按天分组的流程所需的平均时间
    • @weano。我更新了我的答案。你能检查一下吗?我将我的代码分成 3 部分(out= 的每一行)。您可以逐步执行它以了解每个转换。
    • 在我介绍未在同一天完成这两个步骤的用户之前,此方法有效
    【解决方案2】:

    好的,我试试:

    (df
      .sort_values(by='time') # just to make sure
      .assign(day = lambda x: x['time'].dt.day)
      .groupby(['user', 'day']) # seems like a good place to start, also groupby preserves order.
      .apply(lambda x: (x
                .loc[lambda x: x != x.shift(1)] # Keeps only the last of step 1 (but allows for more than one process per day)
                .assign(diff = lambda x: x['time'] - x['time'].shift(1))
                ['diff'].mean()
            )
      )
    )
    

    我没有检查过这个,但试试看。 如果我弄错了,可能应该是.shift(-1)

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 2014-09-24
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多