【问题标题】:How to find Median [duplicate]如何找到中位数[重复]
【发布时间】:2012-05-15 23:25:37
【问题描述】:

我有这样的数据。

Ram,500
Sam,400
Test,100
Ram,800
Sam,700
Test,300
Ram,900
Sam,800
Test,400

从上述数据中优化“中位数”的最短方法是什么。 我的结果应该是......

中位数 = 1/2(n+1),其中 n 是样本中数据值的数量。

Test 500
Sam 700
Ram 800

【问题讨论】:

  • 如果您只是在寻找中值算法,请尝试this one

标签: python median


【解决方案1】:

Python 3.4 内置了statistics,所以可以使用statistics.median的方法:

>>> from statistics import median
>>> median([1, 3, 5])
 3

【讨论】:

    【解决方案2】:

    使用numpy's median 函数。

    【讨论】:

      【解决方案3】:

      有点不清楚您的数据实际上是如何表示的,所以我假设它是一个元组列表:

      data = [('Ram',500), ('Sam',400), ('Test',100), ('Ram',800), ('Sam',700), 
              ('Test',300), ('Ram',900), ('Sam',800), ('Test',400)]
      
      from collections import defaultdict
      
      def median(mylist):
          sorts = sorted(mylist)
          length = len(sorts)
          if not length % 2:
              return (sorts[length / 2] + sorts[length / 2 - 1]) / 2.0
          return sorts[length / 2]
      
      data_dict = defaultdict(list)
      for el in data:
          data_dict[el[0]].append(el[1])
      
      print [(key,median(val)) for key, val in data_dict.items()] 
      print median([5,2,4,3,1])   
      print median([5,2,4,3,1,6])
      #output:
      [('Test', 300), ('Ram', 800), ('Sam', 700)]
      3
      3.5
      

      函数median 从列表中返回中位数。如果有偶数个条目,则取中间两个条目的中间值(这是标准的)。

      我使用defaultdict 创建了一个以您的数据及其值作为键的字典,这是对您的数据更有用的表示。

      【讨论】:

      • 如果你把n = len(sorts)考虑在内,这个功能可能会更清晰一点
      • median() 在空列表上崩溃,您可能需要在开头添加 if not mylist: return 0
      • @OlivierBlanvillain 它不会崩溃,但会引发异常,您可以捕获该异常。这是正确的行为,因为空列表的中位数是 undefined 并且绝对不是“0”(这是 [2,-1,0] 之类的中位数)
      • 我想这取决于你如何看待它。无论如何,必须为未定义的值捕获“IndexError”对我来说似乎不是很地道。可能会引发 ValueError,或者返回 None...
      【解决方案4】:

      看看这个:

      def median(lst):
          even = (0 if len(lst) % 2 else 1) + 1
          half = (len(lst) - 1) / 2
          return sum(sorted(lst)[half:half + even]) / float(even)
      

      注意:

      sorted(lst) 生成lst 的排序副本;

      sum([1]) == 1;

      【讨论】:

        【解决方案5】:

        获取整数数据列表中位数的最简单方法:

        x = [1,3,2]
        print "The median of x is:",sorted(x)[len(x)//2]
        

        【讨论】:

        • 对于任何想要查找它的人://表示截断除法(就像python 2.x中的正常除法一样)
        • 这当然是正确的,因为它不适用于偶数个元素。
        【解决方案6】:

        我从 user3100512 的答案开始,很快意识到它不适用于偶数个项目。我添加了一些条件来计算中位数。

        def median(x):
            if len(x)%2 != 0:
                return sorted(x)[len(x)/2]
            else:
                midavg = (sorted(x)[len(x)/2] + sorted(x)[len(x)/2-1])/2.0
                return midavg
        
            median([4,5,6,7])
        

        应该返回 5.5

        【讨论】:

          猜你喜欢
          • 2020-12-31
          • 2018-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 1970-01-01
          • 2019-06-07
          • 2021-08-10
          相关资源
          最近更新 更多