Python 检查数据帧的最后一行是否满足条件的最佳方法是什么?
我在尝试创建一个新列时遇到了困难,该列是基于“signal”列的check列。如果最后五行(包括最后一行)为1,则返回1;如果最后五行(包括最后一行)为0,则返回0,其他所有内容都将是check的最后一个值,如下所示: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
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:我发布了这个问题的答案