python - 如何对位于两个缺失值之间的列表元素进行子集化?
问题描述
使用包含一些缺失值的列表,例如:
[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]
关于如何以不那么繁琐的方式做到这一点的任何建议?
解决方案
我是一个 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.])
推荐阅读
- bash - 嵌套 sed(sed 中的 sed)
- javascript - 回调函数被读取为对象?
- python - Pandas GroupBy 用于行号
- xodus - 为什么 `toIdString` 是 `Entity` 的成员?
- c - c整数除法不返回正确的商
- reactjs - Cannot read property 'isLoggedIn' of null
- android - 如何从 ionic/react 构建 APK 以安装在我的 android 设备上或在 google play 上发布?
- alexa - 在 Alexa 的单个自定义插槽中使用数字和短语
- python - 对多行 pandas 的 groupby 应用逻辑
- python - 我认为 scipy.interpolate 可能被破坏了或者我用错了?