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

