2014-10-27 2 views
0

У меня есть dataframe данных регистрации сеанса. Каждая запись связана с классом (e, c, g, m). Так строки выглядят так:Вычисление среднего значения для переменных класса в python dataframe

1: [session_start_time session_end_time class_id problems_completed student_id student_account_created student_previous_logins_total student_previous_class_logins duration] 

2: [1/6/12 16:28 1/6/12 16:55 e 37 91 10/26/11 0:00 76 27 1/1/04 0:27] 

3: [1/11/12 13:18 1/11/12 13:58 m 33 172 1/10/12 0:00 5 3 1/1/04 0:40] 

Я пытаюсь вычислить среднюю «продолжительность» для каждого класса (Е, С, г и т.д.). У меня возникли проблемы с поиском правильной команды, чтобы вычислить среднее значение для каждого класса, а не среднее значение для всего столбца.

ответ

0

Я точно не знаю, какой формат/структура данных у вас означает, что ваши исходные данные находятся, поскольку то, что вы представляете, не является точным представлением Python. Но давайте предположим, что ваши ряды списки строк (или могут быть легко преобразованы в них):

rows = [ 
    [ '1/6/12 16:28', '1/6/12 16:55', 'e' ], 
    [ '1/11/12 13:18', '1/11/12 13:58', 'm' ], 
    [ '1/13/12 13:20', '1/13/12 13:24', 'm' ] 
] 

Тогда, вот один из способов вычислить среднее по классам:

from collections import Counter 
from datetime import datetime 

def parse(s, format="%x %H:%M"): 
    """ 
    Return parsed datetime in the given format. 
    """ 
    return datetime.strptime(s, format) 

total_items = Counter() 
total_duration = Counter() 

for start, end, kind in rows: 
    duration = parse(end) - parse(start) 
    total_items[kind] += 1 
    total_duration[kind] += duration.total_seconds() 

means = { k: total_duration[k]/total_items[k] for k in total_items } 
print means 

Это использует collections.Counter s для отслеживания как количества каждого класса в журнале, так и продолжительности. Длительность должна быть вычислена сначала, анализируя представление строки даты/времени во внутренний формат, такой как datetime.datetime. Как только счетчики накапливаются, понимание словаря вычисляет среднее значение для вида (что вы называете «классом», но это техническая конструкция Python, поэтому я называю это видом).

В результате means хранит вычисленные значения. means['m'] дает среднее значение для всех записей 'm' и т. Д.

В то время как функция parse будет работать для нескольких образцов данных, которые вы указали в своем вопросе, синтаксический анализ даты и времени довольно утончен. Вместо использования здесь метода strptime я рекомендую использовать более экспансивный и инклюзивный парсер, например, найденный в модуле dateutil. Если вы хотите использовать это, удалить или переименовать функцию parse найти здесь, а также замену:

from dateutil.parser import parse 

Это обеспечивает падение в замену с гораздо более широким спектром принятых форматов.

Смежные вопросы