我需要从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]]