如何在DataFrame按prd_id分组后,首次出现1时递增计数器?
按分组实现状态切换递增计数器
要针对每个prd_id分组独立实现你要的计数器逻辑(当counter1从非1值变为1时,counter_2递增),只需在原逻辑外层套上groupby('prd_id')分组处理即可,确保每个分组内的计数互不干扰。
实现代码
方法1:使用groupby.apply
df['counter_2'] = df.groupby('prd_id').apply( lambda group: ((group['counter1'] == 1) & (group['counter1'].shift(1) != 1)).cumsum() ).reset_index(level=0, drop=True)
方法2:使用groupby.transform(更清晰易维护)
先定义分组处理函数,再通过transform应用到每个分组:
def calculate_group_counter(group): # 标记当前行是1且前一行不是1的位置,再累加计数 return ((group == 1) & (group.shift(1) != 1)).cumsum() df['counter_2'] = df.groupby('prd_id')['counter1'].transform(calculate_group_counter)
示例验证
用样例数据测试效果:
import pandas as pd # 构造测试数据 data = { 'prd_id': ['product_A', 'product_A', 'product_A', 'product_B', 'product_B', 'product_B'], 'counter1': [0, 1, 1, 1, 0, 1] } df = pd.DataFrame(data) # 应用方法2的逻辑 def calculate_group_counter(group): return ((group == 1) & (group.shift(1) != 1)).cumsum() df['counter_2'] = df.groupby('prd_id')['counter1'].transform(calculate_group_counter) print(df)
输出结果:
prd_id counter1 counter_2 0 product_A 0 0 1 product_A 1 1 2 product_A 1 1 3 product_B 1 1 4 product_B 0 1 5 product_B 1 2
可以看到,每个prd_id分组内独立计数:product_A中第一次出现1时counter_2变为1,后续保持;product_B中首次1记为1,从0再次变为1时counter_2递增到2,符合需求。
内容的提问来源于stack exchange,提问作者Darko37
相关产品推荐
相关产品推荐

