簡體   English   中英

如何對位於兩個缺失值之間的列表元素進行子集化?

[英]How to subset list elements that lie between two missing values?

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

[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]

關於如何以不那么麻煩的方式做到這一點的任何建議?

您可以使用內置函數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)

輸出:

[14, 19]

我是一個 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 評論的那樣,如果連續三個 nans,這些解決方案將在結果中包含中間的一個(就像你原來的那樣)。 這是一個沒有的(在測試中,我用 nan 替換了 14):

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

使用列表理解

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)

更正了其他貢獻者指出的錯誤。 這現在應該適用於所有情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM