在Python中,移除NaN值后列表的中位数

6

在不显式去除NaN而是忽略它们的情况下,能否计算列表的中位数?

我想要median([1,2,3,NaN,NaN,NaN,NaN,NaN,NaN])等于2,而不是NaN。


2
你提到了列表,但标记为pandas。对于系列,默认情况下调用median将忽略NaN值:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.median.html#pandas.Series.median - EdChum
2个回答

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。)


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)`


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接