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

2024-04-20 11:55:38 发布

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

我有一个带有一堆布尔值的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

Tags: to方法infalsetruepandasinputoutput
2条回答

如果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上循环,只替换其中出现的元素。你知道吗

我怀疑这件事不需要一个循环就能完成。直觉是,对于任何一个给定的元素,你都不知道它是真是假,除非你评估了前面所有的元素。你知道吗

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

然后您可以遍历真值的位置,对于那些距离最后一个“好”位置在N个单位之内的值,将相应的值设置为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]

初始化好位置,以便始终选择第一个真实位置:

last_true_loc = - N - 1

遍历其余的真实位置:

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]

相关问题 更多 >