Python 3 - Leer y escribir valores en un .csv

Estoy leyendo un archivo .csv, quiero extraer ciertos valores y escribirlos en un nuevo archivo result.csv (B). Intenté hacer esto con el código (A), que solo funciona parcialmente.

En la definición, pongo todas las variables de las que quiero extraer eventualmente los valores coincidentes del archivo .csv que estoy leyendo. (excepto "record_id" y "abreviatura", porque los completaré manualmente)

Ahora, al ejecutar el código (A), genera el siguiente resultado en result.csv:

Salida de corriente

record_id  abbreviation  patient_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 
70520161453                          3           292,34    1,67             ,         107,8    ,                    0,004                   1,051                     0,008                    ,          96,746       ,               1,116       ,              2,988            ,           ,            ,                 ,

Como puede ver, faltan muchos valores en comparación con la salida deseada (B), así como algunos que se muestran, pero incorrectos.

Ahora los problemas que estoy enfrentando son los siguientes:

Problema 1

Como estoy comparando nombres en el archivo .csv que estoy leyendo, con los nombres en mi definición (A). Algunos de ellos no coinciden exactamente o se confunden con otros que tienen parcialmente el mismo nombre.

Este es el problema para:

patient_id, velocity, step_time, stride_length, swing_time, stance_time, single_supp_time, double_supp_time, toe_in_out

Por ejemplo, la velocidad de mi definición coincide con la velocidad del archivo .csv que estoy leyendo, pero también coincide con stridevelocitystddev. Esto está causando el valor faltante para la velocidad.

Problema 2

Todas las siguientes variables contienen 2 valores en lugar de 1, por ejemplo, step_time contiene el valor 0,558 y 0,554. Para todas estas variables que contienen 2 valores, quiero calcular el promedio de las dos y luego solo escribir el promedio (en este ejemplo, el promedio de 0,558 y 0,554 = 0,56) en el resultado.csv que pertenece a step_time.

step_time, step_length, cycle_time, stride_length, hh_base_support, swing_time, stance_time, single_supp_time, double_supp_time, toe_in_out

Espero que alguien pueda ayudarme a solucionar estos problemas, ¡será apreciado!

Siéntase libre de jugar con el archivo de exportación que estoy usando, puede descargarlo aquí:Archivo de exportación CSV

(A) Código de Python

import csv
from collections import defaultdict
from datetime import datetime

data = defaultdict(str)
result = 'path/to/file/result_%s.csv'%datetime.now().strftime('%b-%d-%Y_%H%M')

#Make a list with the predefined variables
definition = ["record_id", "abbreviation", "patient_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('path/to/file/Export 4.csv', 'r') as f, open(result, '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:
        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)
                    data[item] = avg
                except ValueError:
                    avg = 0  # for cases with entry strings or commas
                data[item] = row[1]

    data['record_id'] = datetime.now().strftime('%m%d%Y%H%M')

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

(B) Salida deseada .csv

record_id  abbreviation  patient_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 
70520161453              25          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

Respuestas a la pregunta(0)

Su respuesta a la pregunta