如何按连续1值序列及其结束后一行分组Pandas DataFrame
分组连续1值序列及其后续行的解决方案
原始数据
import pandas as pd df = pd.DataFrame({'a': [1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0]})
需求说明
需要按连续的1值序列,加上该序列结束后的那一行进行分组。例如第一组包含前三行连续的1,以及紧随其后的一行0;连续的多个0中,仅保留每个1序列后的第一个0,其余0行不纳入分组。期望分组结果如下:
a 0 1 1 1 2 1 3 0 4 1 5 0 6 1 7 1 8 0 10 1 11 1 12 0
尝试过的无效方法
曾尝试相关分组方案及以下代码,但均无法得到预期结果:
df.groupby(df.a.diff().cumsum().eq(1))
可行解决方案
通过标记连续1序列、筛选目标行后分组,代码如下:
# 标记每个连续1序列的唯一编号 streak = df['a'].ne(0).cumsum() # 生成分组键:仅保留连续1的行,以及每个1序列后的第一个0行 group_key = streak.where(df['a'].eq(1) | (df['a'].eq(0) & df['a'].shift(1).eq(1))) # 移除无分组的行(即连续0中不属于1序列后续的行) target_df = df[group_key.notna()] # 按分组键完成分组 result_groups = target_df.groupby(group_key) # 遍历输出每个分组(验证结果) for _, group in result_groups: print(group) print()
代码说明
streak = df['a'].ne(0).cumsum():给每一段连续的1序列分配唯一编号,连续0的行继承前一个编号(直到下一段1出现)。group_key:筛选出两类行:值为1的行,以及值为0且前一行是1的行,其余行标记为NaN。- 移除NaN行后,剩余行就是需要分组的目标数据,按
group_key分组即可得到符合需求的结果。
内容的提问来源于stack exchange,提问作者AmirX
相关产品推荐
相关产品推荐

