【问题标题】:Pandas - Traverse Table to Get Accumulated Days and Activity CountPandas - 遍历表以获取累积天数和活动计数
【发布时间】:2022-08-18 17:58:51
【问题描述】:

我想在完成销售之前获得间隔天数、累积天数和非销售活动总数。

非常感谢任何帮助,因为我想不出一个干净的方法来做到这一点。我尝试使用 pandas\' shift 但我无法得到正确的结果。

输入熊猫表:

ID Date Activity
ID123 2021-01-01 Activity Type 1
ID123 2021-01-05 Activity Type 2
ID123 2021-01-07 Activity Type 1
ID123 2021-01-10 Sales
ID456 2021-01-01 Sales
ID456 2021-01-05 Sales
ID789 2021-01-20 Activity Type 1
ID789 2021-01-25 Sales
ID789 2021-01-27 Activity Type 2
ID789 2021-01-30 Sales

期望的输出:

ID Date Activity Gap from Last Activity Accumulated Days Activity Count
ID123 2021-01-01 Activity Type 1 1
ID123 2021-01-05 Activity Type 2 5 5 2
ID123 2021-01-07 Activity Type 1 2 7 3
ID123 2021-01-10 Sales 3 10 3
ID456 2021-01-01 Sales 0
ID456 2021-01-05 Sales 0
ID789 2021-01-20 Activity Type 1 1
ID789 2021-01-25 Sales 5 5 1
ID789 2021-01-27 Activity Type 2 1
ID789 2021-01-30 Sales 3 3 1

    标签: python pandas


    【解决方案1】:

    IIUC,您可以使用groupby 操作:

    df['Date'] = pd.to_datetime(df['Date'])
    m = df['Activity'].str.startswith('Activity')
    g = df.groupby(['ID', (~m[::-1]).cumsum()])
    
    df2 = df.assign(**{'Gap': g['Date'].diff(),
                       'Accumulated': lambda d: d.groupby('ID')['Gap']
                                                 .apply(lambda x: x.fillna('0').cumsum()
                                                                   .mask(x.isna())
                                                       ),
                       'Count': lambda d: g.cumcount().mask(d['Gap'].isna()).ffill(limit=1)
                       })
    

    输出:

          ID       Date         Activity    Gap Accumulated  Count
    0  ID123 2021-01-01  Activity Type 1    NaT         NaT    NaN
    1  ID123 2021-01-05  Activity Type 2 4 days      4 days    1.0
    2  ID123 2021-01-07  Activity Type 1 2 days      6 days    2.0
    3  ID123 2021-01-10            Sales 3 days      9 days    3.0
    4  ID456 2021-01-01            Sales    NaT         NaT    3.0
    5  ID456 2021-01-05            Sales    NaT         NaT    NaN
    6  ID789 2021-01-20  Activity Type 1    NaT         NaT    NaN
    7  ID789 2021-01-25            Sales 5 days      5 days    1.0
    8  ID789 2021-01-27  Activity Type 2    NaT         NaT    1.0
    9  ID789 2021-01-30            Sales 3 days      8 days    1.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2023-03-22
      相关资源
      最近更新 更多