python - 比较 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
,在TEST
7 天的日期范围内,列中有False
一个Online
。例如,在 2018 年 3 月 3 日,由于TEST
是 False,我想检查列中所有正负 7 天(即正负timedelta(days = 7)
)的 False 值Online
。Online
因此,由于在 7 天的时间范围内没有 False值,那么我们将返回 False。另一方面,考虑日期 2018-03-09,其中Online
是 True 和TEST
False。由于在2018 年Online
3 月 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
有什么想法吗?提前致谢!
解决方案
基于很棒的@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
进入系列(当然是元素方面)。 Check
False
希望能帮助到你。
推荐阅读
- maven - Maven Wildfly 插件部署需要很长时间
- python - 对数据执行操作并将列添加到 groupby 结果
- python - Pandas 需要将 0.0 浮点数转换为空字符串,而不会弄乱 Pandas 中的其他数字
- ios - 带有进度条的简单 URLSession uploadTask
- c# - 根据 JSON 结构创建 C# 类
- sql-server - AS - SQL Server 存储过程附近的语法不正确
- sql - 当涉及两个以上的表时更新 Oracle 的 SQL - ORA-00933
- html - 将链接转发到主页上的锚标记
- android - ExifInterface 不适用于 api 27
- laravel - 无法在 Docker 中连接到 Laravel 中的 pgsql