在python中使用迭代器范围进行迭代

问题描述

在这个数据框中,我想以 3 行的跨度进行迭代

df = pd.DataFrame(index=range(0,43),columns=['slow','fast','p'])
df.slow = 5
df.fast = [
        
    2,2,3,4,5,6,7,8,9,7
      
          ]
df.p = [
    
    1,1,10,8
    
]

逻辑:
如果快 > 慢且 p >= 快且 p[-1] p[-2] p[-3] > 慢 = 数组追加 True

我的尝试:

iterarray = [-1,-2,-3]
array = []

for i in range(len(df.index[2:])):
    if df.fast[i] > df.slow[i] and df.p[i] >= df.fast[i] and df.p[i:i+len(iterarray)] > df.slow[i:i+len(iterarray)]:
        array.append(True)
    else:
        array.append(False)

但我收到一个错误

ValueError: The truth value of a Series is ambiguous. Use a.empty,a.bool(),a.item(),a.any() or a.all().

我怎样才能实现正确的迭代?

解决方法

在最后一个条件 df.p[i:i+len(iterarray)] > df.slow[i:i+len(iterarray)] 中,您比较 3 对数字。这 3 对有 3 对结果(真或假),python 不能自然地合并这 3 个结果。 您必须使用 .all(),如果所有对都是 True,则返回 True

...
if df.fast[i] > df.slow[i] and df.p[i] >= df.fast[i] and (df.p[i:i+len(iterarray)] > df.slow[i:i+len(iterarray)]).all():
...
,

如果你想检查条件(快大于慢)是否为真,以及之前的一些记录,你可以这样做:

for i in [1,2,3]:
    df[f"col_-{i}"] = (df['slow'] < df['fast']) & (df['fast'] <= df['p']) &(df['slow'].shift(i) < df['p'].shift(i))