如何使用条件分组并获得 cumcount?

How to groupby and get cumcount using a criteria?

我有一个如下所示的数据框

df = pd.DataFrame(
    {'supplier_id':[1,1,1,1],
     'prod_id':[123,456,789,342],
     'country' : ['UK', 'UK', 'UK','US'],
     'transaction_date' : ['13/11/2020', '10/1/2018','11/11/2017', '27/03/2016'],
     'industry' : ['STA','STA','PSA','STA'],
     'segment' : ['testa','testb','testa','testc'],
     'label':[1,1,1,0]})

我的objective是找出以下问题的答案

a) 从当前行开始,同一供应商在同一国家/地区之前(之前)成功和失败了多少次? (使用 supplier_idcountry 列)。这里列 label = 1 表示成功,label = 0 表示失败

同样,我想根据industrycountrysegment计算成功和失败的次数。

请注意,第一笔交易将始终以 0 开头,因为供应商之前没有与该列关联的交易。

当我们查看完成的业务的时间顺序时,我们需要首先根据 transaction_date.

对数据框进行排序

所以,我尝试了以下

df.sort_values(by=['supplier_id','transaction_date'],inplace=True)
df['prev_biz_country_success_count'] = df.groupby(['supplier_id', 'country']).cumcount()
df['prev_biz_country_failure_count'] = df.groupby(['supplier_id', 'country']).cumcount()

但如您所见,我不确定如何包含 label 列值。也就是说,我们需要根据label=1和label=0来统计。

我希望我的输出如下所示

我们可以按 supplier_idcountry 列对数据帧进行分组,然后 apply 变换函数 shift + cumsumlabel 列上获取前几行中符合条件的行数

g = df.groupby(['supplier_id', 'country'])

for criteria, label in dict(success=1, failure=0).items():
    df[f'prev_biz_country_{criteria}_count'] =\
        g['label'].apply(lambda s: s.eq(label).shift(fill_value=0).cumsum())

   supplier_id  prod_id country transaction_date industry segment  label prev_biz_country_success_count prev_biz_country_failure_count
1            1      456      UK        10/1/2018      STA   testb      1                              0                              0
2            1      789      UK       11/11/2017      PSA   testa      1                              1                              0
0            1      123      UK       13/11/2020      STA   testa      1                              2                              0
3            1      342      US       27/03/2016      STA   testc      0                              0                              0