【问题标题】:How to groupby and make calculations on consecutive rows of the group?如何分组并对组的连续行进行计算?
【发布时间】:2021-11-17 18:00:19
【问题描述】:

例如,让我们考虑以下数据框:

   Restaurant_ID Floor Cust_Arrival_Datetime
0       100        1    2021-11-17 17:20:00
1       100        1    2021-11-17 17:22:00
2       100        1    2021-11-17 17:25:00
3       100        1    2021-11-17 17:30:00
4       100        1    2021-11-17 17:50:00
5       100        1    2021-11-17 17:51:00
6       100        2    2021-11-17 17:25:00
7       100        2    2021-11-17 18:00:00
8       100        2    2021-11-17 18:50:00
9       100        2    2021-11-17 18:56:00

对于上面的玩具示例,我们可以认为Cust_Arrival_Datetime 按商店和楼层进行排序和分组(如上所示)。现在,我们如何计算每个独特商店和楼层组的客户到达的中间时间间隔等数据?

期望的输出是:

   Restaurant_ID Floor  Median Arrival Interval(in minutes)
0       100        1    3
1       100        2    35

平均到达间隔计算如下:对于商店的一楼,我们可以看到到第二个顾客到达时,距离第一个顾客到达已经过去了 2 分钟。同样,第 2 位和第 3 位顾客之间经过了 3 分钟,而第 3 位和第 4 位顾客之间经过了 5 分钟等。1 楼和餐厅 100 的中位数为 3。

我尝试过这样的事情:

df.groupby(['Restaurant_ID', 'Floor'].apply(lambda row: row['Customer_Arrival_Datetime'].shift() - row['Customer_Arrival_Datetime']).apply(np.median)

但这不起作用!

欢迎任何帮助!

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    IIUC,你可以的

    (df.groupby(['Restaurant_ID', 'Floor'])['Cust_Arrival_Datetime']
       .agg(lambda x: x.diff().dt.total_seconds().median()/60))
    

    你得到

    Restaurant_ID  Floor
    100            1         3.0
                   2        35.0
    Name: Cust_Arrival_Datetime, dtype: float64
    

    如果需要,您可以与reset_index 链接

    【讨论】:

      【解决方案2】:

      考虑以下数据框:

      df = pd.DataFrame({
        'group': [1,1,1,2,2,2],
        'time': pd.to_datetime(
          ['14:14', '14:17', '14:25', '17:29', '17:40','17:43']
        )
      })
      

      假设,您想应用一系列转换:

      def stats(group):
        diffs = group.diff().dt.total_seconds()/60
        return {
            'min': diffs.min(),
            'mean': diffs.mean(),
            'median': diffs.median(),
            'max': diffs.max()
        }
      

      然后你只需要应用这些:

      >>> df.groupby('group')['time'].agg(stats).apply(pd.Series)
      
             min  mean  median   max
      group                         
      1      3.0   5.5     5.5   8.0
      2      3.0   7.0     7.0  11.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        • 2017-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多