在pandas序列中查找值序列

mklgxw1f  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(107)

我正在寻找在较长的pandas系列中查找不同长度的值序列的最佳方法。例如,我有值[92.6, 92.7, 92.9](但也可以是长度2或5),并希望查找在较长的系列中出现此确切序列的所有情况

s = pd.Series([92.6,92.7,92.9,24.2,24.3,25.1,24.9,25.1,24.9,97.6,94.5,1.0,92.6,92.7,92.9,97.9,96.8,96.4,92.8,92.8,93.1,89.5,89.6])

(实际系列长度约为1000)。
在这个例子中,正确的结果应该是索引0,1,212,13,14

k4emjkb1

k4emjkb11#

使用rolling标识每个拉伸的最后一行:

target = [92.6, 92.7, 92.9]

m = s.rolling(len(target)).apply(lambda x: x.eq(target).all())
out = m[m.eq(1)].index

输出:[2, 14]
对于所有指数:

out = [x for end in m[m.eq(1)].index for x in range(end-len(target)+1, end+1)]

输出:

[0, 1, 2, 12, 13, 14]

或者,使用numpysliding_window_view,给出起始索引:

from numpy.lib.stride_tricks import sliding_window_view as swv

out = np.where((swv(s, len(target)) == target).all(axis=1))[0]

输出:array([ 0, 12])
对于所有指数:

out2 = (np.linspace(out[:,None], out[:,None]+len(target)-1, len(target))
          .ravel('F').astype(int)
        )

输出:array([ 0, 1, 2, 12, 13, 14])

相关问题