如何在 pandas Dataframe 中找到 5 个连续行,其中某一列的值至少为 0.5

Max*_*ime 2 python dataframe python-3.x pandas

我有一个包含 3 列的 pandas DataFrame;时间(日期时间对象)、real_genesis(浮点型)和predicted_ Generation(浮点型)。我创建了第四列“残差”(也是浮点数),即实际生成和预测生成之间的差异。我现在想要检测 5 个连续行的残差何时至少为 0.5。数据框如下所示:

Index         Time               real_generation    predicted_generation    residual  
0     2019-01-01 10:00:00+00:00     0.0                  0.239                 0.239
1     2019-01-01 11:00:00+00:00     0.126                0.627                 0.501
2     2019-01-01 12:00:00+00:00     0.227                0.833                 0.606
3     2019-01-01 13:00:00+00:00     0.230                0.833                 0.603
4     2019-01-01 14:00:00+00:00     0.245                0.827                 0.582
5     2019-01-01 15:00:00+00:00     0.255                0.756                 0.501
6     2019-01-01 16:00:00+00:00     0.260                0.627                 0.367
7     2019-01-01 17:00:00+00:00     0.255                0.533                 0.278
8     2019-01-01 18:00:00+00:00     0.248                0.427                 0.179
9     2019-01-01 19:00:00+00:00     0.124                0.233                 0.109
Run Code Online (Sandbox Code Playgroud)

我想创建一个函数来查找这些行并打印每组的第一个索引。这意味着打印索引“1”,因为第 1、2、3、4 和 5 行的残差 > 0.5。我尝试编写一个函数来迭代数据框中的所有行,但它非常慢,所以我想知道是否有更快的方法来做到这一点。我想也许创建一个额外的布尔列“residual>0.5”,当残差至少为 0.5 时为 True,当残差小于 0.5 时为 False,但我真的不知道如何在 Python 中解决这个问题。有谁知道如何实现这个或可能知道一个可能有帮助的功能?提前致谢!

S3D*_*DEV 6

这是一种pandas非迭代方法,因此非常有效。

脚步:

  • 创建 5 个点的滚动窗口并确定最小值。
  • 如果最小值 >= 0.5,则存储True,否则存储False。
  • 所有布尔值都存储在numpy.array名为idx.
  • 该idx数组用作主数据集的过滤器,减去值 4 以确定 5 的运行的第一个索引。
  • 显示过滤后的数据帧。

示例代码:

idx = (df['residual'].rolling(window=5).min() >= 0.5).to_numpy()
df.iloc[df.index[idx]-4]
Run Code Online (Sandbox Code Playgroud)

输出:

Index                       Time  real_generation  predicted_generation  residual
    1  2019-01-01 11:00:00+00:00            0.126                 0.627     0.501  
Run Code Online (Sandbox Code Playgroud)