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

Pandas按ID分组实现条件累计计数并保留首次Job Level变更前Time值

Pandas 按分组生成指定规则Counter列实现方案

核心实现思路

  • 先对数据按ID、Time升序排序,保证时序逻辑正确
  • 给每个ID分组内的连续相同Job Level打区块标记,区分不同的职位等级段
  • 区分第一个职位等级段和后续变更后的段:首段直接取Time值作为Counter,后续每个段内部从0开始递增计数

完整可运行代码

import pandas as pd
import numpy as np

# 构造样例数据(如果是读取自己的数据集替换这部分即可)
data = {
    'ID': [1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2],
    'Time': [17,18,19,20,21,22,23,24,10,11,12,13,14,15,16,17,18],
    'Job Level': ['a','a','a','a','a','b','b','b','a','a','a','a','b','b','b','c','c']
}
df = pd.DataFrame(data)

# 步骤1:按ID、Time排序,保证时序正确
df = df.sort_values(['ID', 'Time']).reset_index(drop=True)

# 步骤2:生成每个ID内的连续Job Level区块标记
df['level_block'] = df.groupby('ID')['Job Level'].transform(lambda x: (x != x.shift()).cumsum())

# 步骤3:生成Counter列
df['Counter'] = np.where(
    df['level_block'] == 1, # 首段直接取Time值
    df['Time'],
    # 非首段按ID+level_block分组,从0开始递增计数
    df.groupby(['ID', 'level_block']).cumcount()
)

# 可选:删除辅助计算列level_block
df = df.drop('level_block', axis=1)

# 输出结果
print(df)

原代码问题说明

  1. 排序只按ID处理,没有按Time排序,时序不稳定可能导致结果错误
  2. 只标记了Job Level变更的位置,没有对变更后的连续段做分组累计计数,只替换了变更行的值为0,没有实现后续行的递增逻辑
  3. 代码中混用了多个不同的数据源和列名(promo_details、emp_id、time_in_level),和实际处理的df列名不匹配,会直接触发运行报错

内容的提问来源于stack exchange,提问作者Vardaan Khanted

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:18:03