如何通过删除Python中的nan来查找列表中的中位数

时间:2017-02-14 02:39:15

标签: python-3.x

我想创建一个返回列表中值列表的函数,下面是我的例子:

y=[1,3,3,4,5,0,0,0,0,0,0,0,0,1,2,2,4,5,0,0,0,0,0,1,3,4,5,4,2,0,0,0,0,0,1,4,5,2,4]

我想计算每组元素的中位数,在我的情况下,答案将不为零 [3.0, 2.0, 3.5, 4.0] 我写了下面这个函数,但我确信它并不是最特别的pythonic方式,我收到一个警告,我正在计算("空切片的平均值")

def my_func(list1):
  median = 0
  list2 = []
  total = []

  for i in list1:
    if i != 0:
      total.append(i)
    else:
      median = np.median(total)
      list2.append(median)
      newList = [i for i in list2 if not math.isnan(i)]
      total = []

return (newList)

还有其他实用的方法可以进行相同的操作。

2 个答案:

答案 0 :(得分:2)

这个怎么样

>>> from itertools import groupby
>>> from statistics import median
>>> y=[1,3,3,4,5,0,0,0,0,0,0,0,0,1,2,2,4,5,0,0,0,0,0,1,3,4,5,4,2,0,0,0,0,0,1,4,5,2,4]
>>> [ median(g) for k,g in groupby(y, lambda x: x!=0) if k ]
[3, 2, 3.5, 4]
>>> 

当您将元素分成零中的某种分割时,我会使用itertools.groupby来执行此操作,此处k对应于我的分组函数g将为true或false {{ 1}}将包含k为真时非零的元素,反之亦然,我使用列表推导来过滤这些元素,如下所示

>>> [ list(g) for k,g in groupby(y, lambda x: x!=0) if k ]
[[1, 3, 3, 4, 5], [1, 2, 2, 4, 5], [1, 3, 4, 5, 4, 2], [1, 4, 5, 2, 4]]
>>> 

然后我使用statistics.median来获得欲望结果

如果您愿意,可以使用

numpy,但这可能只是一个垃圾过度杀伤

>>> [ numpy.median(list(g)) for k,g in groupby(y, lambda x: x!=0) if k ]
[3.0, 2.0, 3.5, 4.0]
>>>   

答案 1 :(得分:0)

这是一种更简洁的方式,虽然可读性较差。

这使用itertools.groupby按给定键函数的结果对连续元素进行分组。在这种情况下,关键功能是元素是否为零。

y = [1,3,3,4,5,0,0,0,0,0,0,0,0,1,2,2,4,5,0,0,0,0,0,1,3,4,5,4,2,0,0,0,0,0,1,4,5,2,4]
groups = [list(group) for is_zero, group in 
          itertools.groupby(y, lambda a: a == 0) if not is_zero]]
medians = [np.median(group) for group in groups]