我有這樣的數據。如何找到中位數
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
我有這樣的數據。如何找到中位數
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
使用numpy's median功能。
它有點不清楚你的數據實際上是如何表示的,所以我認爲這是一個元組列表:
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創建您的數據和他們的價值觀鍵的字典,這是您的數據更加有用表示。
也許功能返回0'開頭:如果你分解出'N = LEN(排序)' –
中位數()崩潰的空單,你可能要加上'如果不是MYLIST會更清晰一點。 – OlivierBlanvillain
@OlivierBlanvillain它不會崩潰,但會引發一個異常,您可以捕獲它。這是正確的行爲,作爲空單的中值*不確定*,絕對不是「0」(這是類似的中位數'[2,-1,0]') –
最簡單的方法:
x = [1,3,2]
print "The median of x is:",sorted(x)[len(x)//2]
對於任何有關來關注一下吧://意味着捨去除法(就像在Python 2.x的正常分裂) – Bemmu
這當然是正確的,因爲它不工作爲偶數個元素。 –
檢查了這一點:
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
;
的Python 3.4包括statistics內置的,所以你可以使用的方法statistics.median
:
>>> from statistics import median
>>> median([1, 3, 5])
3
我開始與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
如果你只是在尋找中位數算法試圖[這一個](http://stackoverflow.com/questions/7578689/median-code-explanation) –