当找到True时,填充pandas中的下N行,False

时间:2014-07-23 21:00:37

标签: python numpy 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

2 个答案:

答案 0 :(得分:2)

我怀疑它可以在没有循环的情况下完成。直觉是,对于任何给定的元素,你都不知道它是真还是假,除非你评估所有以前的元素。

但是,正如Yair Daon所建议的那样,仅考虑True值而不是遍历整个数组是有意义的,因为如果您使用大型数据集,这肯定会节省您的时间。

然后你可以遍历真值的位置,以及那些距离最后一个'好'的N个单位的位置。 location,将相应的值设置为False。然后更新好的'位置是下一个真实位置,距离前一个位置超过N个单位。

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]

答案 1 :(得分:0)

如果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,仅替换其中出现的元素。