在Python中计算去除NaN值的列表中位数
有没有办法在计算一个列表的中位数时,不用特别去删除那些NaN(不是一个数字),而是直接忽略它们呢?
我希望像这样调用 median([1,2,3,NaN,NaN,NaN,NaN,NaN,NaN])
时,结果是2,而不是NaN。
2 个回答
2
我会先把列表中的所有NaN(也就是“不是一个数字”的值)清理掉,然后再计算清理后列表的中位数。这里有两种方法可以做到。如果你在用numpy这个库,可以这样做:
x = x[numpy.logical_not(numpy.isnan(x))]
,这里的x
就是你想要计算中位数的列表。
或者,如果你只想用自带的库,也可以这样做:
import math
x = [value for value in x if not math.isnan(value)]
然后要计算中位数,只需使用清理后的列表:`median(x)`。
16
numpy 1.9.0 版本有一个叫 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
比如:
>>> from numpy import nanmedian, NaN
>>> nanmedian([1,2,3,NaN,NaN,NaN,NaN,NaN,NaN])
2.0
如果你不能使用 numpy 1.9.0 版本,可以参考 @Parker 的回答,这样做也可以;例如:
>>> import numpy as np
>>> x = np.array([1,2,3,NaN,NaN,NaN,NaN,NaN,NaN])
>>> np.median(x[~np.isnan(x)])
2.0
或者
>>> np.median(x[np.isfinite(x)])
2.0
(在布尔数组上使用时,~
是表示 not
的一元运算符。)