Python 检查数据帧的最后一行是否满足条件的最佳方法是什么?

Python 检查数据帧的最后一行是否满足条件的最佳方法是什么?,python,pandas,dataframe,Python,Pandas,Dataframe,我在尝试创建一个新列时遇到了困难,该列是基于“signal”列的check列。如果最后五行(包括最后一行)为1,则返回1;如果最后五行(包括最后一行)为0,则返回0,其他所有内容都将是check的最后一个值,如下所示: signal check index 0 1 1 1 1 1 2 1 1 3 1 1 4

我在尝试创建一个新列时遇到了困难,该列是基于“signal”列的check列。如果最后五行(包括最后一行)为1,则返回1;如果最后五行(包括最后一行)为0,则返回0,其他所有内容都将是check的最后一个值,如下所示:

       signal  check
index                
0           1       1
1           1       1
2           1       1
3           1       1
4           1       1
5           1       1
6           0       1
7           0       1
8           0       1
9           0       1
10          0       0
11          0       0
12          0       0
13          1       0
14          0       0
15          1       0
16          1       0
17          1       0
18          1       0
19          1       1
我有以下数据框:

       signal
index        
0           1
1           1
2           1
3           1
4           1
5           1
6           0
7           0
8           0
9           0
10          0
11          0
12          0
13          1
14          0
15          1
16          1
17          1
18          1
19          1
我想要这样的东西:

       signal  check
index                
0           1       1
1           1       1
2           1       1
3           1       1
4           1       1
5           1       1
6           0       1
7           0       1
8           0       1
9           0       1
10          0       0
11          0       0
12          0       0
13          1       0
14          0       0
15          1       0
16          1       0
17          1       0
18          1       0
19          1       1
我将感谢任何帮助


谢谢大家!

您希望在数据帧上使用滚动窗口,然后是
fillna

def allSame(x):
    if (x == 1).all():
        return 1.0
    elif (x == 0).all():
        return 0.0
    else:
        return np.nan

df['signal'] = df.rolling(5).apply(allSame, raw=False).fillna(method="ffill")
rolling
返回多个元素上的滚动窗口对象(本例中为5个)。window对象类似于dataframe,但它在原始dataframe的行上没有行,而是有窗口。我们可以使用它的
apply
方法将每个滚动窗口转换为值,将滚动窗口对象转换为数据帧。
apply
方法采用一个可以将数据数组转换为适当输出值的函数


这里我们传递给
apply
一个函数,如果窗口中的5行分别为1或0,则返回1或0,否则返回NaN。因此,我们得到一个新的数据帧,其值为1、0或NaN。然后在此数据帧上使用
fillna
,用前面的第一个1或0值覆盖NaN值。最后,我们将结果数据帧合并回原始数据帧,创建“信号”列。

尝试
rolling.sum
切片
df
ffill
bfill

df['check'] = df[df.rolling(5).sum().isin([0, 5])].ffill().bfill()

Out[540]:
       signal  check
index
0           1    1.0
1           1    1.0
2           1    1.0
3           1    1.0
4           1    1.0
5           1    1.0
6           0    1.0
7           0    1.0
8           0    1.0
9           0    1.0
10          0    0.0
11          0    0.0
12          0    0.0
13          1    0.0
14          0    0.0
15          1    0.0
16          1    0.0
17          1    0.0
18          1    0.0
19          1    1.0
如果希望
选中
作为整数,只需链加法
astype(int)


您的检查列不是简单地将信号列下移了4行吗?不,不是。因为我可以有“1”,就在0之后,再加上1,依此类推!我编辑这个问题是为了不让人困惑!非常感谢。标准为:1)如果最后5行为1,则检查将为1。2) 如果最后5行为0,则检查将为0,除此之外的任何内容都将是检查的最后一个值!非常感谢。我认为这是不对的。您的解决方案是对最后5个值执行
。如果我的理解正确,我希望
check
列保留该值,直到满足相反的条件为止。@DCzo你是对的,我误解了这个问题。我编辑了我的答案,以符合OP的要求。简洁,但有意义。很好:)@wingedsubmariner谢谢你的帮助!很好的解决方案+1我认为这比使用
.apply()
和函数要好得多。@AndyL。谢谢你的帮助@安迪尔。我意识到我还需要其他标准,然后我发布了另一个问题,如果你能帮忙的话!谢谢大家!@Marcelmendesreseris:我发布了这个问题的答案