2012-05-07 34 views
17

我有這樣的數據。如何找到中位數

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 
+0

如果你只是在尋找中位數算法試圖[這一個](http://stackoverflow.com/questions/7578689/median-code-explanation) –

回答

30

它有點不清楚你的數據實際上是如何表示的,所以我認爲這是一個元組列表:

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

也許功能返回0'開頭:如果你分解出'N = LEN(排序)' –

+0

中位數()崩潰的空單,你可能要加上'如果不是MYLIST會更清晰一點。 – OlivierBlanvillain

+7

@OlivierBlanvillain它不會崩潰,但會引發一個異常,您可以捕獲它。這是正確的行爲,作爲空單的中值*不確定*,絕對不是「0」(這是類似的中位數'[2,-1,0]') –

0
得到一個列表的整數數據的中位數

最簡單的方法:

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

對於任何有關來關注一下吧://意味着捨去除法(就像在Python 2.x的正常分裂) – Bemmu

+5

這當然是正確的,因爲它不工作爲偶數個元素。 –

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;

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