Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Dataframe中找到某列的值至少为0.5的5个连续行_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

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

Python 如何在Dataframe中找到某列的值至少为0.5的5个连续行,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个3列的熊猫数据框;时间(datetime对象)、实时生成(浮点)和预测生成(浮点)。我已经创建了第四列“剩余”(也是浮动),这是真实的_生成和预测的_生成之间的差异。 现在我想检测5个连续行的残差是否至少为0.5。数据帧如下所示: Index Time real_generation predicted_generation residual 0 2019-01-01 10:00:00+00:00 0.0

我有一个3列的熊猫数据框;时间(datetime对象)、实时生成(浮点)和预测生成(浮点)。我已经创建了第四列“剩余”(也是浮动),这是真实的_生成和预测的_生成之间的差异。 现在我想检测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
我想创建一个函数来查找这些行并打印每组的第一个索引。 这意味着打印索引“1”,因为行1、2、3、4和5的残差大于0.5。
我曾经尝试过编写一个函数,迭代数据帧中的所有行,但速度非常慢,所以我想知道是否有更快的方法来实现这一点。我想可能会创建一个额外的布尔列“残数>0.5”,当残数至少为0.5时为真,当它小于0.5时为假,但我真的不知道如何在Python中解决这个问题。有没有人知道如何实现这个功能,或者知道一个可能有用的函数?提前谢谢

一种蛮力方法是首先提取值>=0.5的行:

df_extr = df[df['residual'] >= 0.5]
然后检查此提取的索引是否包含后续序列,例如

def find_n_seq(ll, n):
    row_ids = []
    for i, r in enumerate(ll):
        window = list(ll[i:i+n])
        rg = list(range(r, r+n))
        if len(first) < n:
            break
        if window == rg:
            row_ids.append(r)
    return row_ids


find_n_seq(list(df_extr.index), 5)
def find_n_seq(ll,n):
行_id=[]
对于枚举中的i,r(ll):
窗口=列表(ll[i:i+n])
rg=列表(范围(r,r+n))
如果len(第一个)
这是一种非迭代的方法,因此非常有效

步骤:

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

idx = (df['residual'].rolling(window=5).min() >= 0.5).to_numpy()
df.iloc[df.index[idx]-4]
输出:

Index                       Time  real_generation  predicted_generation  residual
    1  2019-01-01 11:00:00+00:00            0.126                 0.627     0.501  

使用pandas library rolling window并检索5行滚动窗口的max(),如果max()低于0.5,则该窗口中的每个其他值也必须低于0.5。谢谢,但是如果值大于0.5怎么办?然后我仍然不知道它是否适用于该窗口中的所有5个值,对吗?那么我应该迭代剩余的值?也许可以使用
.min()
。然后,如果min>=0.5,您就知道该窗口中的所有值都是可接受的。