在Pandas DataFrame中实现类Excel的连续相同值序列分组编号(新增group_id列)
Pandas实现连续相同值序列分组(group_id递增)
这是个很典型的连续值分组需求,在Pandas里我们可以用向量化操作来高效实现,完全不需要写循环或者自定义函数,代码简洁又性能拉满。
步骤详解
首先先构造你给出的示例DataFrame:
import pandas as pd df = pd.DataFrame({'var1': ['a','a','e','d','d','d','a','a','b','b']}, index=range(1,11))
然后一行代码就能生成需要的group_id列:
df['group_id'] = (df['var1'] != df['var1'].shift()).cumsum() - 1
让我们拆解一下这段代码的逻辑:
df['var1'].shift():把var1列整体向下偏移一行,第一行会变成NaNdf['var1'] != df['var1'].shift():生成一个布尔序列,当当前行和上一行的var1值不同时返回True,否则返回False(第一行因为和NaN比较,结果是True).cumsum():对布尔序列做累加(True等价于1,False等价于0),这样每次遇到新的连续序列时,累加值就会+1,得到从1开始的分组编号- 最后
-1:把分组编号调整为从0开始,和你期望的结果完全匹配
验证结果
运行代码后,输出df就能得到你想要的结果:
var1 group_id 1 a 0 2 a 0 3 e 1 4 d 2 5 d 2 6 d 2 7 a 3 8 a 3 9 b 4 10 b 4
为什么这是最优方法?
这个方案完全利用了Pandas的向量化运算,避免了逐行处理的低效操作(比如apply或者循环),在处理大数据集时性能优势会非常明显,是Pandas社区处理这类连续分组问题的标准解法。
内容的提问来源于stack exchange,提问作者Alexander Borochkin
相关产品推荐
相关产品推荐

