首页 > 解决方案 > 如何对位于两个缺失值之间的列表元素进行子集化?

问题描述

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

[10, 11, 12,np.nan, 14, np.nan, 16, 17, np.nan, 19, np.nan]

如何对位于两个缺失 ( 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]

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

标签: pythonpython-3.xlistnumpy

解决方案


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

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

对于我的示例[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.])

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

>>> a[1:-1][nan[:-2] & ~nan[1:-1] & nan[2:]]
array([19.])

推荐阅读