我有一个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
,只替换其中出现的元素。