当发现True时,将pandas中的下N行填充为False



我有一个pandas系列,其中有一堆布尔值,我想过滤True值组。换句话说,我想实现这个:

def filter_noise_vals(series, N):
    # series: pandas.core.series.Series object with only True and False values
    # N: param that tells method how many subsequent True vals to set to False
    for val in series:
        if val: # value is true
            # set next N values in Series to False

我确信有一种方法可以在不循环的情况下做到这一点,但我不太清楚。如果没有,最好的方法是什么?

对此的伪代码解释是:每当找到True时,将序列中的下一个N项设置为False

输入输出示例:

(N = 5)                 (N = 2)
INPUT:    OUTPUT:       INPUT:    OUTPUT:
=================       =================
True      True          False     False
True      False         False     False
True      False         True      True
True      False         True      False
False     False         True      False
False     False         True      True
False     False         False     False
True      True          False     False
True      False         True      True
False     False         False     False
False     False         True      False
False     False         True      True
True      False         False     False
True      True          True      False
True      False         False     False
True      False         True      True
False     False         True      False
True      False         True      False

我怀疑如果没有循环,这是不可能做到的。直觉是,对于任何给定的元素,你都不知道它是真还是假,除非你计算了之前所有的元素。

但是,正如Yair Daon所建议的,只考虑True值而不是遍历整个数组是有意义的,因为如果你正在处理大型数据集,这肯定会节省你的时间。

然后你可以遍历True值的位置,对于那些距离最后一个"好"位置N个单位以内的位置,将相应的值设置为False。然后将"好"位置更新为离前一个位置超过N个单位的下一个True位置。

input = np.array([True, True, True, True, False, False, False, True, True, 
     False, False, False, True, True, True, True, False, True])   

获取所有真实位置:

true_locs = np.where(input == True)[0]

初始化好位置,使第一个True位置始终被选中:

last_true_loc = - N - 1

遍历剩余的True位置:

for loc in true_locs:
    if loc > last_true_loc + N: 
        last_true_loc = loc
    else: 
        input[loc] = False

结果(N = 5):

print input
[ True False False False False False False  True False False False False
 False  True False False False False]

如果True是密集的,我认为您最好的选择可能只是循环。如果True是稀疏的,您最好找到True的位置并遍历它们。numpy可能会有帮助。

import numpy as np
a = [True,  True, True, False, False, True]
a = np.array(a)
a = np.where(a == True)
a = np.ravel(a)

现在遍历列表a,只替换其中出现的元素。

最新更新