我想在数据框中找到第一个有效信号。定义一个有效信号,即在其前5行中没有信号。 数据框就像:
entry
0 0
1 1
2 0
3 0
4 1
5 0
6 0
7 0
8 1
9 0
10 0
11 0
12 0
13 0
14 0
第4行的进入信号无效,因为在第1行有一个信号。每个信号将否定随后5行中的任何信号。
我通过将apply函数与记录信号行计数器的参数一起使用来实现此目的。 代码如下
import pandas as pd
def testfun(row, orderinfo):
if orderinfo['countrows'] > orderinfo['maxrows']:
orderinfo['countrows'] = 0
if orderinfo['countrows'] > 0:
orderinfo['countrows'] += 1
row['entry'] = 0
if row['entry'] == 1 and orderinfo['countrows'] == 0:
orderinfo['countrows'] += 1
return row
if __name__ == '__main__':
df = pd.DataFrame({'entry':[0,1,0,1,0,0,0,0,1,0,0,0,0,0,0]})
orderinfo = dict(countrows=0, maxrows=5)
df = df.apply(lambda row: testfun(row, orderinfo), axis=1)
print(df)
输出为:
entry
0 0
1 1
2 0
3 0
4 0
5 0
6 0
7 0
8 1
9 0
10 0
11 0
12 0
13 0
14 0
但是我想知道是否有任何矢量化方法可以做到这一点?因为申请不是很有效。
答案 0 :(得分:1)
IIUC,
您需要rolling
,且min_periods=1
和sum
小于或等于1
,并与entry
列进行比较
(df.entry.rolling(4, min_periods=1).sum().le(1) & df.entry).astype(int)
Out[595]:
0 0
1 1
2 0
3 0
4 0
5 0
6 0
7 0
8 1
9 0
10 0
11 0
12 0
13 0
14 0
Name: entry, dtype: int32