【问题标题】:Python 3 - Calculate average & write to .csvPython 3 - 计算平均值并写入 .csv
【发布时间】:2016-06-30 09:05:33
【问题描述】:

(A) Python 代码

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)

(B) 问题

问题在于将平均值包含在 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 中,将不胜感激!

随意使用我正在使用的导出文件,您可以在这里下载: CSV export file

【问题讨论】:

  • 嗯,你已经计算了avg,但是你在哪里把它插入到数据中呢?
  • 您需要将变量avg 写入您的变量data ,该变量将写入您的CSV 文件。
  • 这意味着我必须添加如下内容:data[avg] = row[1]?每当我这样做并运行时,它都会给我一个错误: Traceback(最近一次调用最后一次):第 40 行,在 writer.writerow(data) 文件“C:\Users\Kay_v\Anaconda3\lib\csv.py” ,第 153 行,在 writerow 返回 self.writer.writerow(self._dict_to_list(rowdict)) 文件 "C:\Users\Kay_v\Anaconda3\lib\csv.py",第 149 行,在 _dict_to_list + ", ".join( [repr(x) for x in wrong_fields])) ValueError: dict contains fields not in fieldnames: 0, 0.56, 194.64, 4.65, 1.11, 175.05, 0.47, 97.27, 0.65
  • @Yak 很难得到你想要达到的目标 - 提供一些你想要的示例 O/P!
  • @wolframalpha 我做了一个新的“答案”帖子来解释我想要达到的确切结果。我希望这可以帮助您了解我面临的问题。

标签: python csv average


【解决方案1】:

试试这个:

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])

【讨论】:

    【解决方案2】:

    您正在计算平均值,但没有将其添加到您面临的第一个问题的 csv 文件中 - 我从您的模棱两可的问题中了解到。 首先在列表definition中添加另一列,并将名为average的键添加到dictdata中,这是修改后的代码:

    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)
    

    【讨论】:

    • 我应用了您的调整,但 result.csv 仍然没有显示平均值。我希望我的新帖子能帮助您更好地了解我想要实现的目标
    【解决方案3】:

    我会尝试以更好的方式解释它。我希望 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 个值的值,应计算这 2 个值的平均值,然后将该值也传递给 result.csv

    【讨论】:

    • 在你想要的 O/P 中,平均值在哪里?
    • 你是如何计算 step_time 平均值的?
    • 我不需要一个带有平均值的新列,我想要的是计算包含两个值的所有列的平均值,其中包括:Step Time(sec);0,558;0,554 Step Length(cm);96,746;97,797 然后平均值应替换各自列中的两个值
    • 这是我试图用来计算所有变量平均值的方法,每当我执行 print(avg) 时这似乎都是正确的,但我不知道如何将它们包含到 result.csv尝试: avg = round((float(row[1].replace(',', '.')) + float(row[2].replace(',', '.'))) / 2, 2)除了 ValueError: avg = 0 # 对于有输入字符串或逗号的情况 print(avg)
    • @wolframalpha 我发了一个新帖子,试图更详细地解释我的问题。 Read from & Write values to a .csv
    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多