python - 判断一个序列是否存在于 Pandas Series 中,并返回找到该序列的行

标签 python pandas numpy

我将以下 numpy 数组存储为 Pandas 系列。

array([0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0,
   0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1,
   0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
   0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1,
   1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1,
   0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1,
   1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
   1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0,
   1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
   0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1,
   0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0,
   1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
   0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0,
   1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
   1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1,
   0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1,
   1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1,
   0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0,
   0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,
   1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0,
   0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
   1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0,
   1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0,
   1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0,
   0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1,
   1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1,
   1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0,
   1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1,
   1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0,
   0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0,
   1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0,
   1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1,
   0, 1, 1, 0, 1, 1, 1])

我想确定这个数组中是否有特定的“1”序列。如果是这样,我想得到这些行。即这个数组是否有一个由三个 1 组成的序列?他们在哪里?

我尝试查看 Pandas 文档,例如isin() 但那些处理的是特定元素,而不是元素序列。似乎没有任何功能可以满足我的需求。希望有人能帮忙。谢谢。

最佳答案

Python解决方案

你可以使用 itertools.groupby 来得到你想要的:

from itertools import groupby

def oneruns_groupby(arr, n):
    ix = 0
    ixs = []
    for k,g in groupby(arr):
        leng = len(list(g))
        if k and leng == n:
            ixs.append(ix)
        ix += leng
    return ixs

print(oneruns_groupby(arr, 3))

因此,如果您想查找所有长度为 3(如果有)的游程的索引,您可以像这样使用它(我将调用您的数组 arr,因为我不想复制和粘贴整个巨大的东西):

oneruns_groupby(arr, 3)

输出:

[2, 17, 41, 71, 87, 100, 172, 265, 359, 376, 380, 410, 442, 495, 523, 551, 557, 609, 620, 627, 633, 637, 661, 710, 752]

Numpy 解决方案

这是一个函数,它将为您提供每次运行 1 给定长度 n 值的起始索引:

def oneruns_npcomp(arr, n):
    d = np.diff(np.pad(arr, 1, 'constant'))
    start = (d > 0).nonzero()[0]
    runlen = (d < 0).nonzero()[0] - start

    return start[runlen == n]

测试:

oneruns_npcomp(arr, 3)

输出:

array([  2,  17,  41,  71,  87, 100, 172, 265, 359, 376, 380, 410, 442,
       495, 523, 551, 557, 609, 620, 627, 633, 637, 661, 710, 752])

快速而肮脏的解决方案

这是一个替代的 Numpy 解决方案:

def oneruns_qd(arr, n):
    return ((np.diff(np.pad(arr, 1, 'constant'), n) == 0) & (arr[:-n] == 1)).nonzero()

应该注意的是,快速而肮脏的方法会找到所有长度为 3 或更长1 值的运行。

关于python - 判断一个序列是否存在于 Pandas Series 中,并返回找到该序列的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53827280/

相关文章:

python - 根据条件获取数据帧行数

python - 使用 OpenCV detectorMultiScale 查找最大的矩形

python - 属性错误: 'builtin_function_or_method' object has no attribute 'count'

python - 如何删除链表中的节点?

python - 如何在 Ipython Notebook 中强制输出简短摘要数据帧

python - 如何提高在数据框中使用模糊匹配的速度?

python - 目标和目标我想返回结果(赢、平、输)。 Pandas python

python - 获取 pandas 数据框中一列中 n 个单词的前 n/2 个

python - 无法统一 'Mv2.3' 的 float64 和 array(float64, 1d, C) ,在 c : 处定义

numpy - 从 Cython 调用 clapack