假设我有两个1,0(真或假)的数据帧。第一个是a
,第二个是b
。有没有一种方法可以避免循环,使得当a
为真且b
为真时,最后n个观测值中的任何时间都返回真?例如,假设n=2
,在下面的例子中,因为a
on2019-10-11
是真的,我们将查看b
列,如果它在最后的n
观察中也是真的,那么a
on2019-10-11
列是有效的或设置为真的。否则就是零。
a b
2019-10-08 0 0
2019-10-09 0 0
2019-10-10 0 1
2019-10-11 1 0
2019-10-14 0 0
2019-10-15 0 0
2019-10-16 0 0
我在下面的尝试,太慢了。。。
def compute_stats(z,n,df):
#print()
end_idx = z.iloc[0].Index
if (df.iloc[(end_idx-n):end_idx,1] * 1).sum() > 0:
return 1
else:
return 0
x = data1.cumsum()
x.name = "Signal"
df = pd.concat([data1,data2,x],axis=1)
df['Index'] = list(range(0,len(data1)))
tmp = df.groupby("Signal").apply(lambda z: compute_stats(z,n,df))
在我的尝试中,我基本上创建了一个按每个信号分组的独立ID列。从那里我做了一个小组。在groupby内部调用的函数中,我只是回头看看
b
列中是否有真值。谢谢
最佳答案
我们可以用ffill
来处理limit
df.a.eq(1)&df.b.mask(df.b==0).ffill(limit=2).eq(1)
Out[205]:
2019-10-08 False
2019-10-09 False
2019-10-10 False
2019-10-11 True
2019-10-14 False
2019-10-15 False
2019-10-16 False
dtype: bool
关于python - Pandas 有条件的真实,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58628515/