问题描述
在这个数据框中,我想以 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))