如何找到中位数

19

我有这样的数据。

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

如果你只是在寻找中位数算法,可以尝试这个 - John Mee
6个回答

40

Python 3.4内置 statistics 模块,因此您可以使用方法 statistics.median

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

35

31

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

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创建了一个以您的数据及其值为键的字典,这是您的数据更有用的表示方式。


1
如果你将 n = len(sorts) 提取出来,这个函数可能会更加清晰明了。 - John La Rooy
median() 在空列表上会崩溃,你可能需要在开头添加 if not mylist: return 0 - OlivierBlanvillain
7
它不会崩溃,而是会引发一个异常,你可以捕捉它。这是正确的行为,因为空列表的中位数是未定义的,绝对不是“0”(像[2,-1,0]这样的列表的中位数是“0”)。 - umläute
5
我想这取决于你的看法。无论如何,对未定义值进行“IndexError”捕获似乎不太符合惯用语。也许引发ValueError或返回None会更好一些…… - OlivierBlanvillain

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) 会生成一个已排序的列表副本; sum([1]) == 1;

0

我从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。

0

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

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

2
对于即将查找的任何人:// 表示截断除法(就像 Python 2.x 中的普通除法一样)。 - Bemmu
5
这当然是不正确的,因为它不能处理偶数个元素。 - Lubo Antonov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接