<p>您可以尝试这样做;1)使用<code>df.value.diff().ne(0).cumsum()</code>创建一个额外的组变量来表示值的更改;2)使用<code>transform('size')</code>来计算组大小并与三个值进行比较,然后得到所需的<code>flag</code>列:</p>
<pre><code>df['flag'] = df.value.groupby([df.id, df.value.diff().ne(0).cumsum()]).transform('size').ge(3).astype(int)
df
</code></pre>
<p><a href="https://i.stack.imgur.com/HLIiX.png" rel="noreferrer"><img src="https://i.stack.imgur.com/HLIiX.png" alt="enter image description here"/></a></p>
<hr/>
<p>故障:</p>
<p>1)<em><code>diff</code>不等于0</em>(字面上是<code>df.value.diff().ne(0)</code>的意思)在值发生变化时给出条件<code>True</code>:</p>
<pre><code>df.value.diff().ne(0)
#0 True
#1 False
#2 True
#3 True
#4 False
#5 False
#6 True
#7 False
#8 False
#9 False
#10 True
#11 True
#12 True
#13 False
#14 False
#15 True
#16 False
#17 True
#18 False
#19 False
#20 False
#21 False
#Name: value, dtype: bool
</code></pre>
<p>2)然后<code>cumsum</code>给出一个id的非降序序列,其中每个id表示具有相同值的连续块,注意当对布尔值求和时,<code>True</code>被视为一,而<code>False</code>被视为零:</p>
<pre><code>df.value.diff().ne(0).cumsum()
#0 1
#1 1
#2 2
#3 3
#4 3
#5 3
#6 4
#7 4
#8 4
#9 4
#10 5
#11 6
#12 7
#13 7
#14 7
#15 8
#16 8
#17 9
#18 9
#19 9
#20 9
#21 9
#Name: value, dtype: int64
</code></pre>
<p>3)结合<code>id</code>列,可以对数据帧进行分组,计算分组大小,得到<code>flag</code>列。</p>