2014-10-20 56 views
1

是否可以在不显式删除NaN的情况下计算列表的中位数,而是忽略它们?删除了NaN值的列表的中位数,在python中

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

+2

你提到的名单,但标签这是大熊猫,一系列默认在系列中调用'median'将忽略'NaN'值:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.median.html#pandas.Series.median – EdChum 2014-10-20 21:46:21

回答

7

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 

E.g.

>>> from numpy import nanmedian, NaN 
>>> nanmedian([1,2,3,NaN,NaN,NaN,NaN,NaN,NaN]) 
2.0 

如果你不能使用版本1.9.0的numpy,类似于@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单目运算符符号。)

1

我会清理所有NaN的列表,然后得到清理列表的中位数。想到两种方法。如果您使用的numpy的图书馆,你可以这样做:

x = x[numpy.logical_not(numpy.isnan(x))] 其中x是你想要得到的

中位数或者,如果你只是想使用附带的库,你可以做名单:

import math 
x = [value for value in x if not math.isnan(value)] 

然后得到平均只使用清洗名单:`中位数(X)``