微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。