假设我有以下数据帧:
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
假设一个窗口前面有
k
行,后面有k
行,如我的评论中所述:给出与原始示例相同的输出。您可以更改窗口的大小,修改
k
当然,如果要在后面检查任何一行,那么在我的示例中只需使用
j1 = n
相关问题 更多 >
编程相关推荐