在Pandas DataFrame中基于连续值分组创建并分配序列编号
Pandas实现连续相同值分组编号
原始DataFrame:
import pandas as pd d = pd.DataFrame({'0': ['A', 'A', 'A', 'D', 'D', 'A', 'D', 'A', 'D', 'A', 'D']})
输出:
0 0 A 1 A 2 A 3 D 4 D 5 A 6 D 7 A 8 D 9 A 10 D
目标是生成包含序列编号的DataFrame,要求连续相同值分配同一编号,值切换时编号递增:
0 1 0 A 1 1 A 1 2 A 1 3 D 2 4 D 2 5 A 3 6 D 4 7 A 5 8 D 6 9 A 7 10 D 8
你之前尝试的代码问题在于按值分组后累加,这会导致同一值的不同连续组共享计数,无法正确区分切换后的新组。正确的做法是直接对值切换的标记做累加,不需要分组:
# 标记值发生切换的位置(第一行默认是切换,因为没有前一个值) diff = d['0'].ne(d['0'].shift()) # 对切换标记做累加,得到连续组的编号 d['1'] = diff.cumsum()
执行后就能得到预期的结果:
0 1 0 A 1 1 A 1 2 A 1 3 D 2 4 D 2 5 A 3 6 D 4 7 A 5 8 D 6 9 A 7 10 D 8
原理说明:ne(d['0'].shift())会生成一个布尔序列,当当前值和前一行不同时为True(第一行因为shift()后是NaN,所以ne()结果为True)。对这个布尔序列做cumsum(),True会被当作1累加,False当作0,这样每次值切换时计数就会加1,正好对应连续相同值的分组编号。
内容的提问来源于stack exchange,提问作者lpt
相关产品推荐
相关产品推荐

