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)
原代码问题说明
- 排序只按ID处理,没有按Time排序,时序不稳定可能导致结果错误
- 只标记了Job Level变更的位置,没有对变更后的连续段做分组累计计数,只替换了变更行的值为0,没有实现后续行的递增逻辑
- 代码中混用了多个不同的数据源和列名(
promo_details、emp_id、time_in_level),和实际处理的df列名不匹配,会直接触发运行报错
内容的提问来源于stack exchange,提问作者Vardaan Khanted
相关产品推荐
相关产品推荐

