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

Time:05-05

I need to remove nan values from python list. The problem is that the list can contain lists of one element, lists of two elements or nan values. E.g.:

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)

Unfortunately calling np.isnan() on list with more than 1 element gives error:

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

The same goes for pandas.isnull

math.isnan() on the other hand gives:

TypeError: must be real number, not list

Is there a short way to solve this problem?

CodePudding user response:

The issue is that you cannot test the NaN status on a list. You should only test is on floats.

For this you can use:

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

alternatively:

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

Due to short-circuiting, the np.isnan(x) will only be evaluated if x is a float (or not a list in the alternative), which won't trigger an error.

output: [[1, 2], [8], [6]]

  • Related