基于列a的连续1值及后续行分组,校验组内列b首值是否为1
分组过滤逻辑的有效性验证
原始DataFrame
import pandas as pd df = pd.DataFrame( { 'a': [ 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0], 'b': [-1, 1, 1, -1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1] } )
需求说明
我们需要按列a中连续的1值序列,再加上序列结束后的那一行进行分组,最终期望得到的结果如下:
a b 4 1 1 5 0 -1 10 1 1 11 1 1 12 0 -1
已有分组逻辑
以下代码可实现基础分组(筛选出包含连续1序列+后续0行的组):
# 从后往前标记连续1的分组 g = df.loc[::-1, 'a'].eq(0).cumsum() # 筛选出长度大于1的分组(排除单独的0行) out = [g for _,g in df.groupby(g, sort=False) if len(g)>1]
待验证的过滤代码
现在需要额外校验每个分组中列b的首个值是否为1,尝试用以下代码实现,需验证其有效性:
groups = df.groupby(g).filter(lambda x: x.b.iloc[0] == 1)
有效性分析
- 分组结构说明:
g的分组逻辑是从后往前累加0的计数,正序下每个符合len(g)>1的分组必然是「连续1序列 + 后续第一个0行」的结构,分组首行一定是1所在行。 - 当前场景验证:
- 索引0-3的分组:首行
b=-1,会被过滤,符合预期; - 索引4-5的分组:首行
b=1,会被保留,符合预期; - 索引6-8的分组:首行
b=-1,会被过滤,符合预期; - 索引10-12的分组:首行
b=1,会被保留,符合预期; - 单独的0行(索引9、13)因长度为1,已被
len(g)>1排除,不会进入filter逻辑。
- 索引0-3的分组:首行
- 边界情况适配:
- 若连续1序列首行
b不为1,后续行是1,分组会被过滤,符合校验规则; - 分组不可能出现首行是0的情况,无需额外处理。
- 若连续1序列首行
综上,这段filter代码完全符合需求,能准确筛选出目标分组。
内容的提问来源于stack exchange,提问作者AmirX
相关产品推荐
相关产品推荐

