【问题标题】:create a new column based on groupby date time column at date level in pandas在 pandas 的日期级别基于 groupby 日期时间列创建一个新列
【发布时间】:2020-08-11 06:44:28
【问题描述】:

我有如下所示的数据框。

Doctor       Appointment           Booking_ID   
  A          2020-01-18 12:00:00     1 
  A          2020-01-18 12:30:00     2
  A          2020-01-18 13:00:00     3 
  A          2020-01-18 13:00:00     4
  A          2020-01-19 13:00:00     13
  A          2020-01-19 13:30:00     14 
  B          2020-01-18 12:00:00     5 
  B          2020-01-18 12:30:00     6 
  B          2020-01-18 13:00:00     7
  B          2020-01-25 12:30:00     6 
  B          2020-01-25 13:00:00     7
  C          2020-01-19 12:00:00     19 
  C          2020-01-19 12:30:00     20
  C          2020-01-19 13:00:00     21
  C          2020-01-22 12:30:00     20
  C          2020-01-22 13:00:00     21

从上面我想创建一个名为 Session 的列,如下所示。

预期输出:

Doctor       Appointment           Booking_ID   Session
  A          2020-01-18 12:00:00     1          S1
  A          2020-01-18 12:30:00     2          S1
  A          2020-01-18 13:00:00     3          S1
  A          2020-01-18 13:00:00     4          S1
  A          2020-01-29 13:00:00     13         S2
  A          2020-01-29 13:30:00     14         S2
  B          2020-01-18 12:00:00     5          S3
  B          2020-01-18 12:30:00     6          S3
  B          2020-01-18 13:00:00     17         S3
  B          2020-01-25 12:30:00     16         S4
  B          2020-01-25 13:00:00     7          S4
  C          2020-01-19 12:00:00     19         S5
  C          2020-01-19 12:30:00     20         S5
  C          2020-01-19 13:00:00     21         S5
  C          2020-01-22 12:30:00     29         S6
  C          2020-01-22 13:00:00     26         S6
  C          2020-01-22 13:30:00     24         S6

不同的医生和不同的约会日期应该不同(以天为单位)

我在下面尝试过

df = df.sort_values(['Doctor', 'Appointment'], ascending=True)


df['Appointment'] = pd.to_datetime(df['Appointment'])
dates = df['Appointment'].dt.date

df['Session'] = 'S' + pd.Series(dates.factorize()[0] + 1, index=df.index).astype(str)

但它正在考虑仅基于日期的会话。我也想考虑看医生。

【问题讨论】:

    标签: pandas pandas-groupby


    【解决方案1】:

    使用idxmin 的另一种方法,结果略有不同:

    df['Session'] = 'S' + (df.groupby(
        ['Doctor', df.Appointment.dt.date]
    ).transform('idxmin').iloc[:,0]+1).astype('str')
    

    【讨论】:

      【解决方案2】:

      您可以使用sort_values 并检查日期中的diff 不为0 或医生与shift 的前一行不同,例如:

      df = df.sort_values(['Doctor', 'Appointment'], ascending=True)
      df['Session'] = 'S'+(df['Appointment'].dt.date.diff().ne(pd.Timedelta(days=0))
                           |df['Doctor'].ne(df['Doctor'].shift())).cumsum().astype(str)
      print (df)
         Doctor         Appointment  Booking_ID Session
      0       A 2020-01-18 12:00:00           1      S1
      1       A 2020-01-18 12:30:00           2      S1
      2       A 2020-01-18 13:00:00           3      S1
      3       A 2020-01-18 13:00:00           4      S1
      4       A 2020-01-19 13:00:00          13      S2
      5       A 2020-01-19 13:30:00          14      S2
      6       B 2020-01-18 12:00:00           5      S3
      7       B 2020-01-18 12:30:00           6      S3
      8       B 2020-01-18 13:00:00           7      S3
      9       B 2020-01-25 12:30:00           6      S4
      10      B 2020-01-25 13:00:00           7      S4
      11      C 2020-01-19 12:00:00          19      S5
      12      C 2020-01-19 12:30:00          20      S5
      13      C 2020-01-19 13:00:00          21      S5
      14      C 2020-01-22 12:30:00          20      S6
      15      C 2020-01-22 13:00:00          21      S6
      

      【讨论】:

        【解决方案3】:

        IIUC,这是groupby().numgroup()

        # convert to datetime
        df.Appointment = pd.to_datetime(df.Appointment)
        
        df['Session'] = 'S' + (df.groupby(['Doctor', df.Appointment.dt.date]).ngroup()+1).astype(str)
        

        输出:

           Doctor         Appointment  Booking_ID Session
        0       A 2020-01-18 12:00:00           1      S1
        1       A 2020-01-18 12:30:00           2      S1
        2       A 2020-01-18 13:00:00           3      S1
        3       A 2020-01-18 13:00:00           4      S1
        4       A 2020-01-19 13:00:00          13      S2
        5       A 2020-01-19 13:30:00          14      S2
        6       B 2020-01-18 12:00:00           5      S3
        7       B 2020-01-18 12:30:00           6      S3
        8       B 2020-01-18 13:00:00           7      S3
        9       B 2020-01-25 12:30:00           6      S4
        10      B 2020-01-25 13:00:00           7      S4
        11      C 2020-01-19 12:00:00          19      S5
        12      C 2020-01-19 12:30:00          20      S5
        13      C 2020-01-19 13:00:00          21      S5
        14      C 2020-01-22 12:30:00          20      S6
        15      C 2020-01-22 13:00:00          21      S6
        

        【讨论】:

        • 我认为我们需要 dt.date 而不是 dt.day
        【解决方案4】:

        IIUC,Groupby.ngroupSeries.dt.date

        df['Session'] = 'S' + (df.groupby(['Doctor',pd.to_datetime(df['Appointment']).dt.date])
                                 .ngroup()
                                 .add(1).astype(str))
        

           Doctor          Appointment  Booking_ID Session
        0       A  2020-01-18-12:00:00           1      S1
        1       A  2020-01-18-12:30:00           2      S1
        2       A  2020-01-18-13:00:00           3      S1
        3       A  2020-01-18-13:00:00           4      S1
        4       A  2020-01-19-13:00:00          13      S2
        5       A  2020-01-19-13:30:00          14      S2
        6       B  2020-01-18-12:00:00           5      S3
        7       B  2020-01-18-12:30:00           6      S3
        8       B  2020-01-18-13:00:00           7      S3
        9       B  2020-01-25-12:30:00           6      S4
        10      B  2020-01-25-13:00:00           7      S4
        11      C  2020-01-19-12:00:00          19      S5
        12      C  2020-01-19-12:30:00          20      S5
        13      C  2020-01-19-13:00:00          21      S5
        14      C  2020-01-22-12:30:00          20      S6
        15      C  2020-01-22-13:00:00          21      S6
        

        【讨论】:

          猜你喜欢
          • 2020-07-19
          • 2018-12-08
          • 2018-09-16
          • 1970-01-01
          • 2020-06-07
          • 1970-01-01
          • 2020-07-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多