You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于列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)

有效性分析

  1. 分组结构说明:g的分组逻辑是从后往前累加0的计数,正序下每个符合len(g)>1的分组必然是「连续1序列 + 后续第一个0行」的结构,分组首行一定是1所在行。
  2. 当前场景验证:
    • 索引0-3的分组:首行b=-1,会被过滤,符合预期;
    • 索引4-5的分组:首行b=1,会被保留,符合预期;
    • 索引6-8的分组:首行b=-1,会被过滤,符合预期;
    • 索引10-12的分组:首行b=1,会被保留,符合预期;
    • 单独的0行(索引9、13)因长度为1,已被len(g)>1排除,不会进入filter逻辑。
  3. 边界情况适配:
    • 若连续1序列首行b不为1,后续行是1,分组会被过滤,符合校验规则;
    • 分组不可能出现首行是0的情况,无需额外处理。

综上,这段filter代码完全符合需求,能准确筛选出目标分组。

内容的提问来源于stack exchange,提问作者AmirX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:08:23