Python中基于二进制列生成特定分组规则的group_id列
解决基于二进制列生成自定义分组ID的问题
问题说明
需要基于二进制列diff生成group_id,规则如下:
- 每个值为1的行对应独立且递增的group_id
- 连续的0行归为同一个group_id,不同组的连续0使用新的group_id
当前使用df['group_id1'] = df['diff'].cumsum()得到的结果不符合预期,期望得到示例中的group_id2效果:
| diff | group_id1 | group_id2 | |
|---|---|---|---|
| 0 | 1 | 1 | 1 |
| 1 | 0 | 1 | 2 |
| 2 | 0 | 1 | 2 |
| ... | ... | ... | ... |
| 9 | 1 | 2 | 3 |
| 10 | 1 | 3 | 4 |
| ... | ... | ... | ... |
| 18 | 0 | 10 | 12 |
| 19 | 0 | 10 | 12 |
解决方案
核心思路是先标记所有新分组的起始行,再对标记列做累加得到目标分组ID:
import pandas as pd # 构造示例数据 data = { 'diff': [1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0] } df = pd.DataFrame(data) # 标记新分组起始行:diff为1,或当前是0且前一行是1 df['is_new_group'] = (df['diff'] == 1) | ((df['diff'] == 0) & (df['diff'].shift(1) == 1)) # 累加标记列生成目标group_id2 df['group_id2'] = df['is_new_group'].cumsum() # 查看结果 print(df[['diff', 'group_id2']])
结果解释
is_new_group列会在每个1行、每个连续0块的第一行标记为True- 对该列执行
cumsum()后,每个标记点会生成一个新的递增ID,完全匹配需求:- 每个1行对应唯一ID
- 同一连续0块共享一个ID,不同0块ID依次递增
内容的提问来源于stack exchange,提问作者mc866
相关产品推荐
相关产品推荐

