问题
Is it possible to calculate the median of a list without explicitly removing the NaN's, but rather, ignoring them?
I want median([1,2,3,NaN,NaN,NaN,NaN,NaN,NaN])
to be 2, not NaN.
回答1:
numpy 1.9.0 has the function nanmedian
:
nanmedian(a, axis=None, out=None, overwrite_input=False, keepdims=False)
Compute the median along the specified axis, while ignoring NaNs.
Returns the median of the array elements.
.. versionadded:: 1.9.0
E.g.
>>> from numpy import nanmedian, NaN
>>> nanmedian([1,2,3,NaN,NaN,NaN,NaN,NaN,NaN])
2.0
If you can't use version 1.9.0 of numpy, something like @Parker's answer will work; e.g.
>>> import numpy as np
>>> x = np.array([1,2,3,NaN,NaN,NaN,NaN,NaN,NaN])
>>> np.median(x[~np.isnan(x)])
2.0
or
>>> np.median(x[np.isfinite(x)])
2.0
(When applied to a boolean array, ~
is the unary operator notation for not
.)
回答2:
I would clean the list of all NaN's, and then get the median of the cleaned list. There're two ways that come to mind. If you're using the numpy library, you can do:
x = x[numpy.logical_not(numpy.isnan(x))]
where x
is the list you want to get the median of
Or, if you just want to use the included libraries you can do:
import math
x = [value for value in x if not math.isnan(value)]
Then to get the median just use the cleaned list: `median(x)``
来源:https://stackoverflow.com/questions/26475384/median-of-a-list-with-nan-values-removed-in-python