2012-05-07 3 views
17

У меня есть данные как это.Как найти Медиана

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

Что такое кратчайший способ обрезать «медианную» из приведенных выше данных. Мой результат должен быть чем-то вроде ...

Median = 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

Может функцию будет немного яснее, если вы выберете 'n = len (sorts)' –

+0

median() сбой в пустых списках, вы можете добавить 'if not mylist: return 0' в начале. – OlivierBlanvillain

+7

@OlivierBlanvillain это не сбой, но он вызывает исключение, которое вы можете поймать. это правильное поведение, так как медиана пустого списка * undefined * и определенно не «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