Python按处方周期分组累计计数:统计approval前rejection次数
解决方案
核心思路
要统计每个处方申请流程(即单次approval前的所有rejection)的拒付次数,关键是先划分独立的流程批次,再在每个批次内统计拒付数,而非全局累计。
步骤1:数据排序与批次划分
先确保数据按患者、药品、时间排序,再用approval记录作为批次分隔符,将每个approval及其之前的rejection划分为同一个流程批次:
# 按患者、药品、日期升序排序,保证时间顺序正确 subset = subset.sort_values(['patient_id', 'drug', 'date']) # 生成批次标识:每次approval之后的记录归为新批次 subset['batch'] = subset['claim_type'].eq('approval').shift(fill_value=False).cumsum()
步骤2:统计每个批次的拒付次数
在每个批次内统计rejection的总数,并合并回原数据:
# 统计每个批次的拒付次数 batch_reject_count = subset.groupby(['patient_id', 'drug', 'batch'])['claim_type'].apply( lambda x: x.eq('rejection').sum() ).reset_index(name='reject_count') # 将拒付次数关联回原数据集 subset = subset.merge(batch_reject_count, on=['patient_id', 'drug', 'batch'], how='left')
步骤3:生成期望的cumcount字段
根据需求,给rejection标记该批次的总拒付数,给approval标记为1(代表该流程完成):
import numpy as np subset['cumcount'] = np.where(subset['claim_type'] == 'rejection', subset['reject_count'], 1)
步骤4:去重(可选)
如果需要像期望结果那样,每个批次只保留一条rejection和一条approval(比如取每个批次中最早的记录):
# 按批次和类型分组,保留最早的记录 result = subset.sort_values('date').groupby(['patient_id', 'drug', 'batch', 'claim_type']).head(1)
执行后得到的结果与你期望的表格一致:
| patient_id | date | claim_type | drug | cumcount |
|---|---|---|---|---|
| pat_1 | 2022-07-20 | rejection | drug_a | 2 |
| pat_1 | 2022-07-22 | approval | drug_a | 1 |
| pat_1 | 2022-08-17 | rejection | drug_a | 2 |
| pat_1 | 2022-08-18 | approval | drug_a | 1 |
后续关联需求实现
要提取rejection记录并关联首次拒付后7天内的approval,可以按批次提取关键日期后匹配:
# 提取每个批次的首次拒付日期和approval日期 batch_dates = subset.groupby(['patient_id', 'drug', 'batch']).agg( first_reject_date=('date', lambda x: x[subset['claim_type'] == 'rejection'].min()), approval_date=('date', lambda x: x[subset['claim_type'] == 'approval'].min()) ).reset_index() # 判断approval是否在首次拒付后7天内 batch_dates['within_7_days'] = (batch_dates['approval_date'] - batch_dates['first_reject_date']).dt.days <= 7 # 将关联结果合并到rejection记录中 rejections_with_approval = subset[subset['claim_type'] == 'rejection'].merge( batch_dates[['patient_id', 'drug', 'batch', 'approval_date', 'within_7_days']], on=['patient_id', 'drug', 'batch'], how='left' )
内容的提问来源于stack exchange,提问作者gillygangles
相关产品推荐
相关产品推荐

