如何对位于两个缺失值之间的列表元素进行子集化?

ves*_*and 7 python numpy list python-3.x

使用包含一些缺失值的列表,例如:

[10, 11, 12,np.nan, 14, np.nan, 16, 17, np.nan, 19, np.nan]
Run Code Online (Sandbox Code Playgroud)

如何对位于两个缺失 ( nan) 值之间的值进行子集化?

我知道如何使用for loop

# imports
import numpy as np

# input
lst=[10,11,12,np.nan, 14, np.nan, 16, 17, np.nan, 19, np.nan]

# define an empty list and build on that in a For Loop
subset=[]
for i, elem in enumerate(lst):
    if np.isnan(lst[i-1]) and np.isnan(lst[i+1]):
        subset.extend([elem])

print(subset)

# output
# [14, 19]
Run Code Online (Sandbox Code Playgroud)

关于如何以不那么麻烦的方式做到这一点的任何建议?

rus*_*ro1 7

您可以使用内置函数zip

subset = [e2 for e1, e2, e3 in zip(lst, lst[1:], lst[2:]) if np.isnan(e1) and not np.isnan(e2) and np.isnan(e3)]
print(subset)
Run Code Online (Sandbox Code Playgroud)

输出:

[14, 19]
Run Code Online (Sandbox Code Playgroud)


Kel*_*ndy 7

我是一个 NumPy 菜鸟,所以可能可以做得更好......

>>> a = np.array(lst)
>>> a[1:-1][np.isnan(a[:-2]) & np.isnan(a[2:])]
array([14., 19.])
Run Code Online (Sandbox Code Playgroud)

对于我的示例[1, np.nan][np.nan]评论,这会按预期生成一个空数组。

或者正如 Georgy 评论的那样,isnan只做一次:

>>> a = np.array(lst)
>>> nan = np.isnan(a)
>>> a[1:-1][nan[:-2] & nan[2:]]
array([14., 19.])
Run Code Online (Sandbox Code Playgroud)

正如 kaya3 评论的那样,如果连续三个 nans,这些解决方案将在结果中包含中间的一个(就像你原来的那样)。这是一个没有的(在测试中,我用 nan 替换了 14):

>>> a[1:-1][nan[:-2] & ~nan[1:-1] & nan[2:]]
array([19.])
Run Code Online (Sandbox Code Playgroud)


Ete*_*nal 6

使用列表理解

import numpy as np
lst=[10,11,12,np.nan, 14, np.nan, 16, 17, np.nan, np.nan, np.nan]
subset = [elem for i, elem in enumerate(lst) if i and i < len(lst)-1 and np.isnan(lst[i-1]) and np.isnan(lst[i+1]) and not np.isnan(elem)]
print(subset)
Run Code Online (Sandbox Code Playgroud)

更正了其他贡献者指出的错误。这现在应该适用于所有情况。