使用pandas将阶段哑变量转换为标识跳过阶段的DataFrame
实现逻辑
- 阶段按
stage 1到stage 6的顺序推进,低于当前已到达最高阶段、且从未经历过的阶段即为跳过 - 按
id独立计算每个id的阶段流转记录 is_closed字段取值规则:当前行close lost或close won为1时取1,否则取0
Pandas 实现代码
import pandas as pd import numpy as np # 定义阶段顺序 stage_list = ['stage 1', 'stage 2', 'stage 3', 'stage 4', 'stage 5', 'stage 6'] skip_col_list = [f"{stage} skip" for stage in stage_list] def cal_skip_per_group(group_df): # 累计计算到当前行每个阶段是否曾经经历过 ever_passed = group_df[stage_list].expanding().max().astype(int) # 取每行当前到达的最高阶段索引 max_stage_idx = ever_passed.apply( lambda x: stage_list.index(x[x==1].index[-1]) if x.sum()>0 else -1, axis=1 ) # 生成跳过标识矩阵 skip_matrix = np.zeros(ever_passed.shape, dtype=int) for row_idx in range(len(ever_passed)): current_max = max_stage_idx.iloc[row_idx] if current_max < 0: continue # 最高阶段之前没经历过的标记为跳过 skip_matrix[row_idx, :current_max+1] = 1 - ever_passed.iloc[row_idx, :current_max+1] skip_df = pd.DataFrame(skip_matrix, columns=skip_col_list, index=group_df.index) # 计算是否关闭 skip_df['is_closed'] = ((group_df['close lost'] == 1) | (group_df['close won'] == 1)).astype(int) return skip_df # 执行计算得到结果 res_df = pd.concat( [df[['id']], df.groupby('id', group_keys=False).apply(cal_skip_per_group)], axis=1 )
执行后输出的res_df和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Patelra95
相关产品推荐
相关产品推荐

