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

Pandas如何标记连续值:忽略首次出现,从第二次起标记为1

问题:为连续重复值添加标记列

原始DataFrame创建代码

import pandas as pd

data={'id':[1,2,3,4,5,6,7,8,9,10,11],
      'value':[1,0,1,0,1,1,1,0,0,1,0]}
df=pd.DataFrame.from_dict(data)

输出结果:

id  value
0    1      1
1    2      0
2    3      1
3    4      0
4    5      1
5    6      1
6    7      1
7    8      0
8    9      0
9   10      1
10  11      0

需求说明

新增flag列,规则为:连续相同value的首次出现标记为0,从第二次出现开始标记为1。

当前错误实现及结果

使用以下代码尝试实现,但结果不符合需求:

df['flag'] = df.value.groupby([df.value,df.flag.diff().ne(0).cumsum()]).transform('size').ge(3).astype(int)

得到的错误输出:

id  value  flag
    0    1      1     0
    1    2      0     0
    2    3      1     0
    3    4      0     0
    4    5      1     1
    5    6      1     1
    6    7      1     1
    7    8      0     1
    8    9      0     1
    9   10      1     0
   10   11      0     0

期望输出

id  value  flag
    0    1      1    0
    1    2      0    0
    2    3      1    0
    3    4      0    0
    4    5      1    0
    5    6      1    1
    6    7      1    1
    7    8      0    0
    8    9      0    1
    9   10      1    0
   10   11      0    0

正确实现方法

核心思路是先识别连续相同value的分组,再在每个分组内对非首次出现的行标记为1:

# 生成连续相同value的分组键:每次value变化时分组号+1
df['group'] = (df['value'] != df['value'].shift()).cumsum()
# 每个分组内,从第2个元素(cumcount从0开始,>=1即非首次)标记为1
df['flag'] = df.groupby('group')['value'].cumcount().ge(1).astype(int)
# 可选:删除临时的group列
df = df.drop(columns='group')

执行后得到的结果与期望完全一致:

id  value  flag
0    1      1     0
1    2      0     0
2    3      1     0
3    4      0     0
4    5      1     0
5    6      1     1
6    7      1     1
7    8      0     0
8    9      0     1
9   10      1     0
10  11      0     0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:56:34