Python 如何在Dataframe中找到某列的值至少为0.5的5个连续行
我有一个3列的熊猫数据框;时间(datetime对象)、实时生成(浮点)和预测生成(浮点)。我已经创建了第四列“剩余”(也是浮动),这是真实的_生成和预测的_生成之间的差异。 现在我想检测5个连续行的残差是否至少为0.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
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
数组用作主数据集上的过滤器,减去值4以确定运行5的第一个索引idx
- 给出了过滤后的数据帧
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,您就知道该窗口中的所有值都是可接受的。