将布尔值组合到输入和触发器中的布尔运算

Boolean operation to combine the booleans in an input and a trigger

这是一些带有“输入”列和“触发”列的示例数据。 “输入”列通常为 False 但具有 True 段(例如样本数据中的一个 True 段)。我正在尝试创建第三列(“输出”),它是“输入”列的修改版本。本质上,“输出”中的 True 段应该早于“输入”中的开始,如“触发器”所示(由“触发器”的前一个 True 值表示)。我想通过向量操作来实现这一点,并且我想避免循环,例如对于.

index = pd.date_range('2020-01-01', '2020-01-13', freq='D')
columns = ['Input', 'Trigger']
data = [[False, False],
        [False, False],
        [False, True],
        [False, False],
        [False, False],
        [False, True],
        [False, False],
        [False, False],
        [True, False],
        [True, False],
        [True, False],
        [True, False],
        [False, False]
       ]
pd.DataFrame(data, index, columns)

我不知道如何实现我的目的,但我提供的示例数据的结果如下所示:

columns = ['Input', 'Trigger', 'Output']
data = [[False, False, False],
        [False, False, False],
        [False, True, False],
        [False, False, False],
        [False, False, False],
        [False, True, True],
        [False, False, True],
        [False, False, True],
        [True, False, True],
        [True, False, True],
        [True, False, True],
        [True, False, True],
        [False, False, False]
       ]
pd.DataFrame(data, index, columns)

您可以使用触发器列创建组,然后拆分并回填输入。

df['Output'] = (
 df['Input']
 .replace({False: None})
 .groupby(df['Trigger'].cumsum()).bfill()  # backfill previous NA in group
 .fillna(False)
)

输出:

            Input  Trigger  Output
2020-01-01  False    False   False
2020-01-02  False    False   False
2020-01-03  False     True   False
2020-01-04  False    False   False
2020-01-05  False    False   False
2020-01-06  False     True    True
2020-01-07  False    False    True
2020-01-08  False    False    True
2020-01-09   True    False    True
2020-01-10   True    False    True
2020-01-11   True    False    True
2020-01-12   True    False    True
2020-01-13  False    False   False

注意。这并没有考虑到由于预期行为不明确而在一段时间内触发的情况