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)
逻辑说明
- 按
Session字段分组,确保每个会话的计数逻辑独立不互相干扰 - 用累计求和的方式标记出每个会话内所有处于「Pause到Resume」区间的行,包含Pause和Resume动作本身
- 控制计数增量:只有非暂停区间的行、以及暂停区间的第一行(Pause动作所在行)才会让计数加1,暂停区间剩余行增量为0,实现区间内Label保持一致的效果
- 累加增量后减1得到从0开始计数的Label列
- 最后删除计算过程中产生的辅助列,得到最终结果
运行代码输出的结果和你提供的期望输出完全匹配。
内容的提问来源于stack exchange,提问作者Muhammad Hassan
相关产品推荐
相关产品推荐

