假设我有两个1,0(真或假)的数据帧。第一个是a,第二个是b。有没有一种方法可以避免循环,使得当a为真且b为真时,最后n个观测值中的任何时间都返回真?例如,假设n=2,在下面的例子中,因为aon2019-10-11是真的,我们将查看b列,如果它在最后的n观察中也是真的,那么aon2019-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/

10-15 12:53