包含多个元素的数组的真值是二义性的.从列表的列表中删除nan



我需要从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:包含多个元素的数组的真值是不明确的。使用a.a any()或a.a all()

对于pandas.isnull

也是如此另一方面,math.isnan()给出:

TypeError:必须是实数,而不是列表

有没有简单的方法来解决这个问题?

问题是您无法在列表上测试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)]

由于短路,只有当x时,np.isnan(x)才会被评估。一个浮点数(或者不是一个列表),它不会触发错误。

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

最新更新