首页 > 解决方案 > 比较 Pandas Dataframe 时间窗口内的布尔变量

问题描述

我有一个看起来像这样的熊猫数据框:

   datetime         Online   TEST
61 2018-03-03       True   False
62 2018-03-04       True   False
63 2018-03-05       True   False
64 2018-03-06       True   False
65 2018-03-07       True   False
66 2018-03-08       True   False
67 2018-03-09       True   False
68 2018-03-10       True   False
69 2018-03-11       False  False
70 2018-03-12       False  False

我需要检查列中的每个False,在TEST7 天的日期范围内,列中有False一个Online。例如,在 2018 年 3 月 3 日,由于TEST是 False,我想检查列中所有正负 7 天(即正负timedelta(days = 7))的 False 值OnlineOnline因此,由于在 7 天的时间范围内没有 False值,那么我们将返回 False。另一方面,考虑日期 2018-03-09,其中Online是 True 和TESTFalse。由于在2018 年Online3 月 11 日当天有一个 False,我需要返回一个布尔 True 值,表示在我的 7 天时间范围内有一个 False。

我可以使用一些缓慢而丑陋的循环机制来实现这一点(即使用 遍历每一行DataFrame.iterrows(),检查是否TEST为假,然后拉出正负 7 天的时间窗口,看看是否Online也有相应的False值。但理想情况下,我希望有一些更时髦和更快的东西。对于视觉效果,这就是我需要我的最终数据框的样子:

   datetime         Online   TEST   Check
61 2018-03-03       True   False    False
62 2018-03-04       True   False    True
63 2018-03-05       True   False    True
64 2018-03-06       True   False    True
65 2018-03-07       True   False    True
66 2018-03-08       True   False    True
67 2018-03-09       True   False    True
68 2018-03-10       True   False    True
69 2018-03-11       False  False    True
70 2018-03-12       False  False    True

有什么想法吗?提前致谢!

标签: pythonpandas

解决方案


基于很棒的@piRSquared 评论(我什至不知道该rolling方法,它似乎非常有用!),您可以使用

check = ~(df.TEST + df.Online.rolling(15, center=True, min_periods=1).apply(np.prod).eq(1))

第二个 summand 创建一个 Series 对象,其中每个元素都是一个布尔值,指示在大小为 15 的窗口中是否没有任何False值;这是通过将prod这个滚动窗口内的所有值相乘(NumPy 的函数)来实现的。

总和(使用逻辑逆运算符~)是比较布尔值的,所以我们只有在两列中都有两个时才能True进入系列(当然是元素方面)。 CheckFalse

希望能帮助到你。


推荐阅读