如何在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
相关产品推荐
相关产品推荐

