2016-06-30 2 views
0

(А) Python кодPython 3 - Вычислить среднее значение и запись в .csv

import csv 
from collections import defaultdict 

data = defaultdict(str) 

#Make a list with the predefined variables 
definition = ["record_id", "abbreviation", "patient_id", "study_id", 
"step_count", "distance", "ambulation_time", "velocity", "cadence", 
"normalized_velocity", "step_time_differential", "step_length_differential", 
"cycle_time_differential", "step_time", "step_length", "step_extremity", 
"cycle_time", "stride_length", "hh_base_support", "swing_time", 
"stance_time", "single_supp_time", "double_supp_time", "toe_in_out"] 

#Read the GaitRite .csv 
with open('C:/Users/Kay_v/Documents/School/Exports/Export 3.csv', 'r') as f, open('C:/Users/Kay_v/Documents/School/Exports/result.csv', 'w') as outfile: 
    reader = csv.reader(f, delimiter=';') 
    next(reader, None) # skip the headers 
    writer = csv.DictWriter(outfile, fieldnames=definition, lineterminator='\n') 
    writer.writeheader() 

#Read the .csv row by row 
    for row in reader: 
     #print(row) 
     for item in definition: 
      h = item.replace('_', '') 
      r0 = row[0].lower().replace(' ', '') 
      if h in r0: 
       try: 
        avg = round((float(row[1].replace(',', '.')) + float(row[2].replace(',', '.')))/2, 2) 
      except ValueError: 
       avg = 0 # for cases with entry strings or commas 
       #print(avg) 
       print(h, r0, row[1], row[2]) 
       data[item] = row[1] 

    data['record_id'] = 1 

# Write the clean result.csv 
    writer.writerow(data) 

(Б) Проблема

Проблема состоит в том числе о средних значений в Result.csv , Я использую следующую часть кода для вычисления среднего значения, когда переменная имеет два значения. В нынешней ситуации средняя рассчитывается, но он не отображается в Result.csv

try: 
    avg = round((float(row[1].replace(',', '.')) + float(row[2].replace(',', '.')))/2, 2) 
except ValueError: 
    avg = 0 # for cases with entry strings or commas 

Я надеюсь, что кто-то может помочь, чтобы получить среднее значение, чтобы показать в Result.csv Aswell, был бы весьма признателен!

Не стесняйтесь играть с файлом экспорта я использую, вы можете скачать его здесь: CSV export file

+0

Ну, вы рассчитали 'avg', но где вы вставляете его в данные? –

+0

Вам нужно написать переменную 'avg' в вашу переменную 'data', которая будет записана в файл CSV. –

+0

Значит, мне нужно добавить что-то вроде этого: data [avg] = row [1]? Всякий раз, когда я это сделать и запустить это дает мне ошибку: Traceback (самый последний вызов последнего): линия 40, в writer.writerow (данные) Файл «C: \ Users \ Kay_v \ Anaconda3 \ Lib \ CSV .py ", строка 153, в writerow return self.writer.writerow (self._dict_to_list (rowdict)) Файл« C: \ Users \ Kay_v \ Anaconda3 \ lib \ csv.py », строка 149, в _dict_to_list + "," .join ([repr (x) для x in wrong_fields])) ValueError: dict содержит поля не в полевых именах: 0, 0.56, 194.64, 4.65, 1.11, 175.05, 0.47, 97.27, 0.65 – Yak

ответ

0

Попробуйте это:

if h in r0: 
    try: 
     avg = round((float(row[1].replace(',', '.').replace(';', '.')) + float(row[2].replace(',', '.').replace(';', '.')))/2, 2) 
     data[item] = avg 
    except ValueError: 
     data[item] = 0 # for cases with entry strings or commas 
     #print(avg) 
     print(h, r0, row[1], row[2]) 
0

Вы вычисления среднего, но не добавляя его в файл CSV файл первой проблемы, с которой вы сталкиваетесь, из того, что я понял из вашего двусмысленного вопроса. Сначала добавьте еще один столбец в списке definition и добавить ключ с именем average в Словаре data, вот модифицированный код:

import csv 
from collections import defaultdict 

data = defaultdict(str) 

#Make a list with the predefined variables 
definition = ["record_id", "abbreviation", "patient_id", "study_id", 
"step_count", "distance", "ambulation_time", "velocity", "cadence", 
"normalized_velocity", "step_time_differential", "step_length_differential", 
"cycle_time_differential", "step_time", "step_length", "step_extremity", 
"cycle_time", "stride_length", "hh_base_support", "swing_time", 
"stance_time", "single_supp_time", "double_supp_time", "toe_in_out", "average"] 

#Read the GaitRite .csv 
with open('Export 3.csv', 'r') as f, open('result.csv', 'w') as outfile: 
    reader = csv.reader(f, delimiter=';') 
    next(reader, None) # skip the headers 
    writer = csv.DictWriter(outfile, fieldnames=definition, lineterminator='\n') 
    writer.writeheader() 

#Read the .csv row by row 
    for row in reader: 
     #print(row) 
     for item in definition: 
      h = item.replace('_', '') 
      r0 = row[0].lower().replace(' ', '') 
      if h in r0: 
       try: 
        avg = round((float(row[1].replace(',', '.')) + float(row[2].replace(',', '.')))/2, 2) 
       except ValueError: 
        avg = 0 # for cases with entry strings or commas 
       # print(avg) 
       # print(h, r0, row[1], row[2]) 
       data[item] = row[1] 
       data['average'] = avg  
    data['record_id'] = 1 

# Write the clean result.csv 
    print data 
    writer.writerow(data) 
+0

Я применил настройки ур, но результат .csv по-прежнему не показывает средние значения.Я надеюсь, что мой новый пост поможет вам лучше понять, чего я пытаюсь достичь. – Yak

0

Я попытаюсь объяснить это лучше. Я хотел бы, чтобы в конечном итоге Result.csv выход следующее:

Желаемая выход

record_id abbreviation patient_id study_id step_count distance ambulation_time velocity cadence normalized_velocity step_time_differential step_length_differential cycle_time_differential step_time step_length step_extremity cycle_time stride_length hh_base_support swing_time stance_time single_supp_time double_supp_time toe_in_out 
1            3   292,34 1,67    175,1  107,8       0,004     1,051      0,008     0,56  97,27      1,11  194,64   4,65    0,47  0,65   0,47    0,18    1,45 

Проблема заключается в том, что некоторые из значений в CSV-я чтение данных из, содержит 2 значения (например, step_time [0,558; 0,554]), а другие содержат только 1 значение (например, step_count [3]). Те, которые содержат только 1 значение, могут быть сразу переданы в result.csv. Но для тех, которые содержат 2 значения, среднее значение этих двух значений должно быть рассчитано, а затем это значение также должно быть передано в result.csv

+0

В вашем желаемом O/P, где среднее? – wolframalpha

+0

Как вы вычислили среднее значение step_time? – wolframalpha

+0

Мне не нужен новый столбец со средним значением, я хочу рассчитать среднее значение всех столбцов, содержащих два значения, которые среди прочего: Шаг Время (сек); 0,558; 0,55 Шаг Длина (см); 96 746; 97,797 В этом случае avarage следует заменить два значения в соответствующих столбцах. – Yak