如何在某些系列中找到系列的一部分

2024-05-20 15:02:21 发布

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

问题很简单。你知道吗

假设我们有一系列值:

srs = pd.Series([7.0, 2.0, 1.0, 2.0, 3.0, 5.0, 4.0])

如何找到子序列1.0, 2.0, 3.0的位置(索引)?你知道吗


Tags: 序列seriespdsrs
3条回答

一种简单的方法是迭代序列,将n元素子集,然后比较它们是否等于给定的列表:

代码如下:

srs = pd.Series([7.0, 2.0, 1.0, 2.0, 3.0, 5.0, 4.0])
sub_list = [1.0, 2.0, 3.0]


n = len(sub_list)
index_matching = []
for i in range(srs.shape[0] - n + 1):
    sub_srs = srs.iloc[i: i+n]
    if (sub_srs == sub_list).all():
        index_matching.append(sub_srs.index)

print(index_matching)
# [RangeIndex(start=2, stop=5, step=1)]

或者在一行中列出:

out = [srs.iloc[i:i+n].index for i in range(srs.shape[0] - n + 1) if (srs.iloc[i: i+n] == sub_list).all()]
print(out)
# [RangeIndex(start=2, stop=5, step=1)]

如果要显式列表:

real_values = [[i for i in idx] for idx in out]
print(real_values)
# [[2, 3, 4]]

使用rolling window我们可以找到列表a的第一个匹配项,它在窗口的末尾(右边框)放置一个“marker”(例如0,任何非Nan值都可以)。然后我们使用^{}找到这个元素的索引,并根据窗口大小更正这个值:

a = [1.0, 2.0, 3.0]
srs.rolling(len(a)).apply(lambda x: 0 if (x == a).all() else np.nan).first_valid_index()-len(a)+1

输出:

2

最简单的解决方案可能是使用列表理解:

a = srs.tolist() # [7.0, 2.0, 1.0, 2.0, 3.0, 5.0, 4.0]
b = [1.0, 2.0, 3.0]

[x for x in range(len(a)) if a[x:x+len(b)] == b]
# [2]

相关问题 更多 >