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

Pandas按规则新增Label列:每个Session中Pause到Resume区间标签值相同

实现代码

import pandas as pd

# 输入DataFrame
df_input = pd.DataFrame(data={'Session': [0, 0, 0, 0, 0, 0, 0, 0, 0,  1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2],
                              'Action': ['Start', 'Action1', 'Action2', 'Action3', 'Pause', 'Action4',
                                         'Action5', 'Resume', 'Finish', 'Start', 'Action1', 'Action2', 'Pause',
                                         'Action3', 'Action4', 'Resume', 'Finish', 'Start', 'Action1',
                                         'Action2', 'Finish']})

def calc_session_label(group):
    # 标记当前行是否属于Pause到Resume的区间(包含两端动作)
    group['in_pause_block'] = (
        group['Action'].eq('Pause').cumsum() 
        - group['Action'].eq('Resume').cumsum().shift(fill_value=0)
    ).clip(lower=0, upper=1)
    # 定义计数增量规则:非暂停区每行增量为1,暂停区仅Pause行增量为1、其余行增量为0
    group['inc'] = 1
    group.loc[
        (group['in_pause_block'] == 1) & (group['in_pause_block'].shift(fill_value=0) == 1),
        'inc'
    ] = 0
    # 累加增量后减1得到从0开始的Label
    group['Label'] = group['inc'].cumsum() - 1
    return group

# 按Session分组独立计算Label
df_output = df_input.groupby('Session', group_keys=False).apply(calc_session_label).drop(columns=['in_pause_block', 'inc'])
print(df_output)

逻辑说明

  1. 按Session字段分组,确保每个会话的计数逻辑独立不互相干扰
  2. 用累计求和的方式标记出每个会话内所有处于「Pause到Resume」区间的行,包含Pause和Resume动作本身
  3. 控制计数增量:只有非暂停区间的行、以及暂停区间的第一行(Pause动作所在行)才会让计数加1,暂停区间剩余行增量为0,实现区间内Label保持一致的效果
  4. 累加增量后减1得到从0开始计数的Label列
  5. 最后删除计算过程中产生的辅助列,得到最终结果

运行代码输出的结果和你提供的期望输出完全匹配。

内容的提问来源于stack exchange,提问作者Muhammad Hassan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:36:00