python - Pandas :计算第一个连续的真值

标签 python pandas numpy

我正在尝试实现一个函数来识别 Pandas Series 中的 first consecutive 出现,它已经被我想要的条件掩盖了:(例如)

[真,真,真,假,真,假,真,真,真,真]

我希望上面的输入给出 3 的结果,即从系列开头开始连续出现 3 次 True

我知道一个大的 for 循环就可以完成这项工作,但是是否有任何矢量化/以 Pandas 为中心的方法来绕过它?

非常感谢。

最佳答案

问题:

找到第一个连续的 True
考虑 a

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

答案 1
numpy:在 a 的否定上使用 np.logical_and.accumulate 并取其否定来制作消除第一个系列的掩码False 如果它们应该存在。然后在末尾附加一个 False 以确保我们有一个非 True 分钟。最后,使用 np.argmin 定位第一个最小值。如果它找到一个位置 3,那将在它之前指示 3 True 值。

np.argmin(np.append(a[~np.logical_and.accumulate(~a)], False))

3

答案 2
numba.njit

我想使用 numba 这样我就可以循环并确保在我们想要/需要时短路。这是阵列中肯定要尽早回答的问题。不需要无缘无故地评估整个阵列的事物。

from numba import njit

@njit
def first_true(a):
    true_started = False
    c = 0
    for i, j in enumerate(a):
        if true_started and not j:
            return c
        else:
            c += j
            true_started = true_started or j
    return c

first_true(a)

3

答案 3
numpy 更智能地使用 argminargmax。我用 False 包围 a 然后使用 argmax 找到第一个 True 然后从那一点开始,使用 argmin 找到之后的第一个 False
注意:@Divakar 对此答案进行了改进,取消了 np.concatenate 的使用,而是使用了 if/then/else。这将这个已经非常快的解决方案减少了 3 倍!

def first_true2(a):
    a = np.concatenate([[False], a, [False]])
    return np.argmin(a[np.argmax(a):])

first_true2(a)

3

这些答案有多快?
See @Divakar's Answer for source code of other functions being timed

%timeit first_true(a)
%timeit np.argmin(np.append(a[~np.logical_and.accumulate(~a)], False))
%timeit np.diff(np.flatnonzero(np.diff(np.r_[0,a,0])))[0]
%timeit first_True_island_len(a)
%timeit first_true2(a)
%timeit first_True_island_len_IFELSE(a)


a = np.array([True, True, True, False, True, False, True, True, True, True])    
1000000 loops, best of 3: 353 ns per loop
100000 loops, best of 3: 8.32 µs per loop
10000 loops, best of 3: 27.4 µs per loop
100000 loops, best of 3: 5.48 µs per loop
100000 loops, best of 3: 5.38 µs per loop
1000000 loops, best of 3: 1.35 µs per loop

a = np.array([False] * 100000 + [True] * 10000)
10000 loops, best of 3: 112 µs per loop
10000 loops, best of 3: 127 µs per loop
1000 loops, best of 3: 513 µs per loop
10000 loops, best of 3: 110 µs per loop
100000 loops, best of 3: 13.9 µs per loop
100000 loops, best of 3: 4.55 µs per loop

a = np.array([False] * 100000 + [True])
10000 loops, best of 3: 102 µs per loop
10000 loops, best of 3: 115 µs per loop
1000 loops, best of 3: 472 µs per loop
10000 loops, best of 3: 108 µs per loop
100000 loops, best of 3: 14 µs per loop
100000 loops, best of 3: 4.45 µs per loop

关于python - Pandas :计算第一个连续的真值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44611125/

相关文章:

python - 嵌套字典的问题

python - 根据条件打乱数据帧的行

python - Pandas:使用波浪号运算符通过两个过滤器返回反向数据

python - 循环遍历字典键的元素而不是枚举所有元素

python - 使用 CImg 将图像文件转换为像素 vector ?

python - 使用 Numpy 将图像切片为 "Tiles"

具有互斥可选参数的 python 类/子类,使用父类(super class)的实例作为可能的构造函数

python - 在 Python 中使用 Openpyxl 修改现有的 Excel 文件

python - 如何在 Qt 中设置按钮背景颜色,甚至覆盖平台主题?

python - 从 Numpy 中的 N 个向量中找到所有唯一的(几乎)平行 3d 向量对的最快方法