在Python中计算去除NaN值的列表中位数

6 投票
2 回答
13825 浏览
提问于 2025-04-28 15:56

有没有办法在计算一个列表的中位数时,不用特别去删除那些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 的一元运算符。)

撰写回答