如何在Pandas中标记False-False后首次出现的True-False行?
解决Pandas中标记特定条件行的问题
原始数据
先看初始的DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [False, True, False, False, False, False, True, True, False, True], 'B': [True, False, False, False, True, True, False, False, False, False ] })
输出结果:
A B 0 False True 1 True False 2 False False 3 False False 4 False True 5 False True 6 True False 7 True False 8 False False 9 True False
需求说明
要识别并标记在[False - False]值对之后首次出现的[True - False]行,并在新列中标记符合条件的行。比如示例里:
- 行3是
[False-False],之后首次出现的[True-False]是行6 - 行8是
[False-False],之后首次出现的[True-False]是行9
这两行就是需要标记的目标行。
解决代码
直接上可行的实现代码,每一步都有注释:
# 1. 定义两个基础掩码:分别标记[False-False]和[True-False]的行 ff_mask = (df['A'] == False) & (df['B'] == False) tf_mask = (df['A'] == True) & (df['B'] == False) # 2. 把[False-False]的掩码向后移一位,代表从该行之后开始追踪 ff_shifted = ff_mask.shift(1).fillna(False) # 3. 用ffill填充,得到每个[False-False]行之后的连续追踪区间 tracking_interval = ff_shifted.ffill() # 4. 对每个追踪区间,只保留第一个出现的[True-False]行 df['target'] = tf_mask & tracking_interval & ~tf_mask.groupby((~tracking_interval).cumsum()).cumcount().gt(0) # 查看结果 print(df)
运行结果
新增target列后,符合条件的行会被标记为True:
A B target 0 False True False 1 True False False 2 False False False 3 False False False 4 False True False 5 False True False 6 True False True 7 True False False 8 False False False 9 True False True
内容的提问来源于stack exchange,提问作者prashanth manohar
相关产品推荐
相关产品推荐

