滑动窗口并将数据帧的元素与阈值进行比较

2024-09-28 20:42:29 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据帧:

Time  Flag1 
0      0        
10     0
30     0
50     1
70     1
90     0
110    0

我的目标是确定在任何窗口内,时间是否小于行中的数字加35,如果flag的任何元素为1,则该行将为1。例如,考虑上面的例子:

时间的第一个元素是0,然后是0+35=35,然后在值小于35的窗口中(即时间=0、10、30),所有flag1值都是0,因此第一行将被指定为0,依此类推。然后,下一个窗口将是10+35=45,仍然包括(0,10,30),并且标志仍然是0。因此,完整的输出是:

Time  Flag1   Output
0      0         0   
10     0         0
30     0         1
50     1         1
70     1         1
90     1         1
110    1         1

为了实现这类问题,我想我可以使用两个for循环,如下所示:

Output = []
for ii in range(Data.shape[0]):
       count =0
       th = Data.loc[ii,'Time'] + 35
       for jj in range(ii,Data.shape[0]):
           if (Data.loc[jj,'Time'] < th and Data.loc[jj,'Flag1'] == 1):
                  count = 1
                  break
       output.append(count)

然而,这看起来很乏味。因为内部for循环应该在整个数据长度上继续。此外,我不确定当我们到达数据帧的末尾时,该方法是否检查边界情况是否有越界索引。如果有人能对比这更简单的事情发表评论,我将不胜感激。这就像一个滑动窗口操作,只将数字与阈值进行比较

编辑:我不想只比较两个连续的行。我想,如果例如30+35=65,那么只要时间小于65,那么如果flag1为1,那么输出为1

第二个例子:

Time  Flag1   Output
0      0         0   
30     0         1
40     0         1
60     1         1
90     1         1
140    1         1
200    1         1
350    1         1

Tags: 数据元素foroutputdatatimecount时间
2条回答
import pandas as pd

Data = pd.DataFrame([[0,0],[10,0],[30,0],[50,1],[70,1],[90,1],[110,1]],columns=['Time','Flag1'])

output = Data.index.map(lambda x: 1 if any((Data.Time[x+1:]<Data.Time[x]+35)*(Data.Flag1[x+1:]==1)) else 0).values
output[-1] = Data.Flag1.values[-1]
Data['output'] = output

print(Data)

# show
Time    Flag1   output
0       0       0
30      0       1
40      0       1
50      1       1
70      1       1
90      1       1
110     1       1

假设一个窗口前面有k行,后面有k行,如我的评论中所述:

import pandas as pd

Data = pd.DataFrame([[0,0], [10,0], [30,0], [50,1], [70,1], [90,1], [110,1]],
                    columns=['Time', 'Flag1'])

k = 1   # size of window: up to k rows before and up to k rows after 
n = len(Data)
output = [0]*n
for i in range(n):
    th = Data['Time'][i] + 35
    j0 = max(0, i - k)
    j1 = min(i + k + 1, n)  # the +1 is because range is non-inclusive of end
    output[i] = int(any((Data['Time'][j0 : j1] < th) & (Data['Flag1'][j0 : j1] > 0)))
Data['output'] = output

print(Data)

给出与原始示例相同的输出。您可以更改窗口的大小,修改k

当然,如果要在后面检查任何一行,那么在我的示例中只需使用j1 = n

相关问题 更多 >