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

如何在pandas DataFrame中添加条件计数器生成对应分组编号

实现方案

直接用pandas原生的掩码和位移操作即可完成,无需循环,核心逻辑代码如下:

import pandas as pd

# 构造示例DataFrame
data = {
    'id': [3,3,3,3,3,3,5,5,5],
    'date': ['04/09/2019','30/10/2019','03/05/2020','05/09/2020','31/10/2020','03/11/2020','03/09/2019','27/10/2019','02/05/2020'],
    'notify': ['no','yes','no','no','yes','no','no','yes','no']
}
df = pd.DataFrame(data)

# 核心实现逻辑
## 1. 给所有notify为yes的行生成全局递增的分组编号
mask_yes = df['notify'] == 'yes'
df.loc[mask_yes, 'time_group'] = mask_yes.cumsum()

## 2. 仅给yes行紧邻的下一行no填充对应编号
mask_fill = (df['notify'] == 'no') & (df['notify'].shift(1) == 'yes')
df.loc[mask_fill, 'time_group'] = df['time_group'].shift(1).loc[mask_fill]

# 可选:如果需要把NaN转为空字符串,执行下行代码
# df['time_group'] = df['time_group'].fillna('').astype(str)

print(df)

逻辑说明

  • 第一步通过cumsum()对所有notify=yes的行计数,天然生成全局递增的分组编号,符合编号规则
  • 第二步用你提到的shift(1)获取上一行的notify值和分组编号,仅对yes行紧邻的下一行no做填充,其余行保持空值,完全匹配预期输出
  • 全程无循环操作,处理百万行级数据也不会有性能问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:09:00