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

如何在DataFrame列中提取True值及其相邻的False值

如何提取DataFrame布尔列中所有True行及其紧邻的False行

这是个很实用的需求,我来分享最简的实现方法,完全贴合你想要的效果👇

需求回顾

我们需要从DataFrame的布尔列中:

  • 保留所有值为True的行
  • 同时保留每个连续True块的上一行和下一行(也就是紧邻True集合的前后False行)

示例数据

先构造你给出的示例DataFrame:

import pandas as pd

data = [False, False, True, True, False, False, False, False, True, True, True, False, False, False, False, True, True]
df = pd.DataFrame(data, columns=['flag'])

原df的flag列输出为:

0     False
1     False
2      True
3      True
4     False
5     False
6     False
7     False
8      True
9      True
10     True
11    False
12    False
13    False
14    False
15     True
16     True
Name: flag, dtype: bool

最简实现代码

只需要一行构造筛选掩码,再用掩码过滤DataFrame即可:

# 构造筛选条件:当前行是True,或者下一行是True,或者上一行是True
mask = df['flag'] | df['flag'].shift(1).fillna(False) | df['flag'].shift(-1).fillna(False)
result = df[mask]

输出结果

运行后result的flag列就是你期望的结果:

1     False
2      True
3      True
4     False
7     False
8      True
9      True
10     True
11    False
14    False
15     True
16     True
Name: flag, dtype: bool

逻辑解释

这个掩码mask的三个部分分别对应需求:

  • df['flag']:直接保留所有值为True的行
  • df['flag'].shift(1).fillna(False):将列向下偏移一行,当该值为True时,说明当前行是下一行True的前一行(也就是True块的前置False行),需要保留
  • df['flag'].shift(-1).fillna(False):将列向上偏移一行,当该值为True时,说明当前行是上一行True的后一行(也就是True块的后置False行),需要保留
  • 用fillna(False)处理首尾行偏移后产生的空值,避免影响筛选逻辑

这个方法效率很高,完全基于pandas的矢量化操作,不需要循环,处理大DataFrame也很顺畅。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:16:29