2014-10-20 55 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)``