如何使用条件分组并获得 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_id
和 country
列)。这里列 label = 1 表示成功,label = 0 表示失败
同样,我想根据industry
、country
和segment
计算成功和失败的次数。
请注意,第一笔交易将始终以 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_id
和 country
列对数据帧进行分组,然后 apply
变换函数 shift
+ cumsum
在 label
列上获取前几行中符合条件的行数
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
我有一个如下所示的数据框
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_id
和 country
列)。这里列 label = 1 表示成功,label = 0 表示失败
同样,我想根据industry
、country
和segment
计算成功和失败的次数。
请注意,第一笔交易将始终以 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_id
和 country
列对数据帧进行分组,然后 apply
变换函数 shift
+ cumsum
在 label
列上获取前几行中符合条件的行数
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