熊猫将5行中的一个有效信号矢量化

时间:2019-07-04 06:14:01

标签: pandas

我想在数据框中找到第一个有效信号。定义一个有效信号,即在其前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

但是我想知道是否有任何矢量化方法可以做到这一点?因为申请不是很有效。

1 个答案:

答案 0 :(得分:1)

IIUC,

您需要rolling,且min_periods=1sum小于或等于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