Pandas如何基于A、B列触发条件高效生成布尔列C
需求说明
现有存储布尔值的A、B两列DataFrame,需要新增布尔列C,状态规则如下:
- 当B列出现True时,C立刻置为True,且状态持续保持
- 当A列出现True时,C在下一行开始置为False,且状态持续保持(即A为True的当前行,C仍保持触发前的状态)
- 初始状态下C为False
原始数据示例:
A B 0 False False 1 False False 2 False False 3 True False 4 False False 5 False False 6 False True 7 False False 8 False False 9 False False 10 True False 11 False False 12 False False
期望输出:
A B C 0 False False False 1 False False False 2 False False False 3 True False False 4 False False False 5 False False False 6 False True True 7 False False True 8 False False True 9 False False True 10 True False True 11 False False False 12 False False False
高效向量化实现
逐行for循环在数据量超过10万行时性能会明显下降,用pandas原生的向量化操作可以实现百倍以上的速度提升,代码也更简洁,逻辑完全匹配需求:
import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [False,False,False,True,False,False,False,False,False,False,True,False,False], 'B': [False,False,False,False,False,False,True,False,False,False,False,False,False] }) # 1. 初始化C列为空值 df['C'] = np.nan # 2. B为True的行,C直接置为True(B的触发当前行立刻生效) df.loc[df['B'], 'C'] = True # 3. A为True的行的下一行,C置为False(A的触发下一行才生效) df.loc[df['A'].shift(fill_value=False), 'C'] = False # 4. 向前填充状态,初始空值全部填充为False df['C'] = df['C'].ffill().fillna(False).astype(bool) print(df)
实现说明
- 核心思路是先标记所有状态发生切换的行,直接给这些行赋对应的值,中间没有状态变化的行用
ffill()(向前填充)继承上一个状态,全程没有逐行遍历,底层由C实现,处理百万行数据仅需数毫秒。 - 对A列使用
shift(1)下移一位,刚好匹配"A触发后下一行才变False"的规则,和原循环的判断顺序完全一致:同一行先处理B的开启逻辑、给C赋值,再处理A的关闭逻辑。 - 边界场景兼容:如果同一行A、B同时为True,当前行C会被置为True,下一行开始变为False,和原循环逻辑保持一致。
内容的提问来源于stack exchange,提问作者Avand Fardi
相关产品推荐
相关产品推荐

