当前位置: 首页
编程语言
布尔序列分组与跨组前向后向填充方法

布尔序列分组与跨组前向后向填充方法

热心网友 时间:2026-07-14
转载

在Pandas数据处理中,利用shift、eq、cumsum、where、ffill等函数构建分组键,将每个连续真值段及其后续首个假值划分为一组。随后可以使用ffill和bfill实现组内双向填充,或使用transform( first )高效广播组内首个非空值,从而省去手动切片拼接的繁琐步骤。

本文介绍如何在 Pandas 中按“True 连续段 + 后续首个 False”逻辑划分组,并对每组内 value 列执行前向+后向填充(或仅取首个有效值),高效替代手动切片拼接。

在日常数据处理中,我经常遇到一个需求:根据某个布尔条件,将数据动态划分为多个逻辑组。具体来说,需要将每个连续的 True 块以及它后面紧跟着的那个 False 项,合并成一个完整的组。这听起来有点像“以 False 结尾的 True 段”,但直接用 .cumsum() 来标记分组却行不通。

不过没关系,通过巧妙组合 shift()、eq()、where() 和 ffill(),我们可以构建出分组键,轻松实现这一目标。下面直接提供代码,两种方案均基于同一套核心逻辑,你可根据实际场景灵活选用。

分组键构造原理

先看核心逻辑:如何生成唯一的组 ID?

group_key = (    df['condition'].shift()      # 将 condition 下移一行 → 原索引0变为NaN,索引1值=原索引0    .eq(False)                   # 检查 shifted 后是否为 False(即原位置前一项为 False)    .cumsum()                    # 累计求和:每次遇到原序列中 True→False 转折点时 +1    .where(df['condition'])      # 仅保留 condition==True 的组号,False 位置设为 NaN    .ffill()                     # 向前填充 NaN → 将每个 False 项归属到其前一个 True 组)

这个逻辑的核心在于:每个 True 连续段以及它后面紧跟着的那个 False,都会被划归到同一个组里。而孤立的 False 或开头就是 False 的情况,则不会参与分组(它们会被标记为 NaN,后续自然被忽略)。

方案一:ffill().bfill() 组内双向填充(通用型)

此方法适用于每组内可能有多个非空值,需要利用最近的有效值进行双向扩散的场景。操作如下:

df['value'] = (    df.groupby(group_key)['value']    .apply(lambda x: x.ffill().bfill())    .droplevel(0)  # 移除 groupby 引入的多级索引第一层)

方案二:transform('first')(推荐,更简洁高效)

如果你确定每组内至多只有一个非空值(例如示例中每组只有一个初始数值),那么直接用 transform('first') 就足够了,一步到位,简洁高效。

df['value'] = df.groupby(group_key)['value'].transform('first')

transform('first') 会自动跳过 NaN,找到每组第一个非空值,并把它广播到整组。相比 apply 方案,它的性能更优,也省去了处理索引层级的麻烦,一举两得。

几点提醒

  • group_key 必须与 df['value'] 对齐:这是关键一步。通过 where(...).ffill() 操作,确保 False 行能拿到前一个组的 ID,这样分组才能正确。
  • 空组处理:如果某一组全是 NaN,transform('first') 会返回 NaN,这符合预期。apply 方案中的 ffill().bfill() 同样会保持全 NaN。
  • 边界情况:如果首行是 False,shift() 会产生 NaN,.eq(False) 的结果是 False,不会影响 cumsum 的起始值。末尾的连续 False 则不会被任何组收纳(因为前面没有 True),对应的 value 列会保持 NaN。
  • 性能提示:这套方案全程向量化,避免了用 pd.concat 循环拼接,时间复杂度是 O(n),效率很高。

掌握了这个模式,你就能灵活地扩展到其他类似场景,比如会话分割、事件周期标记等。它不仅让代码可读性更强,运行效率也更高。

来源:https://www.php.cn/faq/2819227.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Go微服务熔断后指数退避重试机制配置

Go微服务熔断后指数退避重试机制配置

熔断器打开后应进入半开状态,再对试探请求启用指数退避重试,避免无效重试。使用gobreaker控制请求准入,backoff控制试探间隔,并启用抖动防止脉冲流量。重试和熔断需分层,重试只针对临时错误,熔断统计重试后的最终结果。

时间:2026-07-14 06:59
Java多重上界通配符无法直接写入语法的根本原因

Java多重上界通配符无法直接写入语法的根本原因

Java通配符仅支持单一上界,如?extendsA,无法直接使用多重上界。多重上界(如TextendsA&B)仅适用于泛型类型参数声明,这是Java泛型设计中的语法限制,旨在简化类型系统。若需多约束,需通过类型参数间接实现。

时间:2026-07-14 06:59
Golang微服务中集成Argo实现GitOps持续发布

Golang微服务中集成Argo实现GitOps持续发布

Go微服务与ArgoCD边界清晰,Application路径指向manifests目录而非源码。镜像更新通过CI自动提交或argocd-image-updater实现,避免写死latest标签。readinessProbe需合理配置initialDelaySeconds与periodSeconds,确保同步顺畅。

时间:2026-07-14 06:59
Java中AbstractList的快速失败机制中并发修改检查方法的执行时机

Java中AbstractList的快速失败机制中并发修改检查方法的执行时机

在AbstractList迭代器中,每次调用next()、remove()、previous()、set()或add()时,都会先执行checkForComodification,通过比较modCount与expectedModCount检测并发修改,确保操作时视图一致性,防止状态错乱。

时间:2026-07-14 06:59
Python中statistics模块快速计算统计学中位数的方法与步骤

Python中statistics模块快速计算统计学中位数的方法与步骤

使用Python的statistics median()计算中位数需注意:不接受空列表,否则抛出StatisticsError异常;不自动过滤None或非数字值;传入大型生成器可能耗尽内存或导致性能下降。建议先过滤脏数据并转为列表,再计算,同时明确空数据时的处理策略。

时间:2026-07-14 06:59
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜