You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pandas将阶段哑变量转换为标识跳过阶段的DataFrame

实现逻辑

  1. 阶段按stage 1到stage 6的顺序推进,低于当前已到达最高阶段、且从未经历过的阶段即为跳过
  2. 按id独立计算每个id的阶段流转记录
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:27:04