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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:10:33