为DataFrame添加按continuity重置的连续group=1分组ID列
解决DataFrame生成group_id列的需求
嘿,这个需求很明确,咱们用Pandas一步步搞定它!先理清楚核心规则:
- 只要
group列是0,group_id直接设为0; - 连续的
group=1行要标同一个整数ID; - 关键:每当
continuity为0时,后续的group=1连续组要从1重新开始编号,之后再依次递增。
下面是具体实现代码,我会逐行解释逻辑:
import pandas as pd # 先假设你的DataFrame已经存在,这里用示例数据演示 data = { 'continuity': [1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1], 'group': [0,1,1,1,0,1,1,1,0,0,1,1,0,1,1,0,0,1,1] } df = pd.DataFrame(data) # 步骤1:标记重置区间——每次continuity=0时,开启一个新的计数区间 df['reset_interval'] = (df['continuity'] == 0).cumsum() # 步骤2:识别所有连续的group块,只保留group=1的块编号,其他设为缺失值 df['block'] = (df['group'] != df['group'].shift()).cumsum() df['block'] = df['block'].where(df['group'] == 1, pd.NA) # 步骤3:在每个重置区间内,对group=1的块分配从1开始的递增ID,group=0的填充为0 df['group_id'] = df.groupby('reset_interval')['block'].rank(method='dense').fillna(0).astype(int) # 可选:清理中间辅助列 df = df.drop(['reset_interval', 'block'], axis=1) # 查看结果 print(df)
代码逻辑解释
- 步骤1:
(df['continuity'] == 0).cumsum()生成递增的区间编号,每遇到continuity=0的行就加1,把数据划分为多个独立的"重置区间",每个区间内的group=1组ID从1重新计数。 - 步骤2:
(df['group'] != df['group'].shift()).cumsum()识别连续的同值块:当当前行group与上一行不同时,编号递增,确保每个连续的group=1/group=0块有唯一标识。再通过where过滤掉group=0的块编号,只保留需要计数的部分。 - 步骤3:按重置区间分组后,用
rank(method='dense')为每个区间内的group=1块生成连续递增的ID,最后将group=0对应的缺失值填充为0并转为整数,得到最终的group_id列。
运行后得到的结果完全符合你给出的示例要求!
内容的提问来源于stack exchange,提问作者Bram Zijlstra
相关产品推荐
相关产品推荐

