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

如何为Pandas DataFrame中连续的1值簇分配唯一标识符

如何为Pandas DataFrame中连续的1值簇分配唯一标识符

这个需求太常见了!常规的groupby确实只会把所有0和所有1分别归为一组,没法区分连续的同值簇。不过用Pandas的几个小技巧就能完美解决,我来给你一步步拆解:

核心思路

我们可以通过标记连续簇的起始点,再对起始点进行累加计数,最后把0的位置清零,就能得到每个连续1簇的唯一ID。

完整解决方案

首先先准备好你的示例数据:

import pandas as pd

df = pd.DataFrame([1,1,1,0,0,0,0,1,1,0,0,0,1,0,1,1,1],columns=['clusters'])

然后执行下面的核心代码:

# 第一步:标记每个连续1簇的第一个元素(起始点)
# 当当前值是1,且前一个值不是1时,标记为True(即1),否则为False(即0)
df['unique'] = (df['clusters'] == 1) & (df['clusters'].shift(1) != 1)

# 第二步:对起始点进行累加,再乘原clusters列把0的位置清零
df['unique'] = df['unique'].cumsum() * df['clusters']

执行后打印df,就能得到你想要的结果:

clusters  unique
0         1       1
1         1       1
2         1       1
3         0       0
4         0       0
5         0       0
6         0       0
7         1       2
8         1       2
9         0       0
10        0       0
11        0       0
12        1       3
13        0       0
14        1       4
15        1       4
16        1       4

代码解释

  • df['clusters'].shift(1):把clusters列向下偏移一行,这样就能和当前行的值对比,判断是否是新簇的起始点
  • (df['clusters'] == 1) & (df['clusters'].shift(1) != 1):这个布尔条件会精准定位每个连续1簇的第一个元素(包括DataFrame开头的第一个1,因为shift(1)会产生NaN,而NaN != 1会返回True)
  • cumsum():对布尔列累加,True会被视为1,False视为0,这样每出现一个新的起始点,累加值就会递增,后续的连续1会继承这个值
  • * df['clusters']:这一步非常关键,它会把所有0对应的累加值清零,刚好符合你要的“0的位置保持0”的需求

如果你喜欢更简洁的写法,也可以把两步合并成一行:

df['unique'] = ((df['clusters'] == 1) & (df['clusters'].shift() != 1)).cumsum() * df['clusters']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 22:07:31