具有多个元素的数组的真值是不明确的。从列表列表中删除 nan

The truth value of an array with more than one element is ambiguous. Removing nan from list of lists

我需要从 python 列表中删除 nan 个值。问题是该列表可以包含一个元素的列表、两个元素的列表或 nan 值。例如:

import numpy as np

mylist = [[1,2],float('nan'),[8],[6],float('nan')]
print(mylist)
newlist = [x for x in mylist if not np.isnan(x)]
print(newlist)

不幸的是,在超过 1 个元素的列表上调用 np.isnan() 会出现错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

pandas.isnull

也一样

math.isnan() 另一方面给出:

TypeError: must be real number, not list

有解决这个问题的捷径吗?

问题是您无法测试列表中的 NaN 状态。你应该只测试浮点数。

为此你可以使用:

newlist = [x for x in mylist if not isinstance(x, float) or not np.isnan(x)]

或者:

newlist = [x for x in mylist if isinstance(x, list) or not np.isnan(x)]

由于 short-circuiting,只有当 x 一个浮点数(或者不是替代列表)时,np.isnan(x) 才会被评估,它赢了'触发错误。

输出:[[1, 2], [8], [6]]