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
相关产品推荐
相关产品推荐

