【问题标题】:Python - Find the average for each column in a csv file excluding headers and timePython - 查找 csv 文件中每一列的平均值,不包括标题和时间
【发布时间】:2016-02-13 05:00:48
【问题描述】:

我正在读取这样的 csv 文件:

with open('data.csv', 'rb') as f:
    reader = csv.reader(f)
    data_list = list(reader)

这里的data_list 是 csv 文件中每一行的列表。所以data_list[0] 是 csv 文件中的第一行(即标题),data_list[1] 之后是包含 csv 文件中数据的实际行,data_line[1:][1] 是时间。

基本上是这样

data_list=
[['','Header1','Header2','Header3'],
['12:02:11', '2.3', '6.2', '11.8'],
['12:05:25', '1.5', '7.5', '13.2'],
['12:10:48', '4.1', '6.8', '12.6'],
['12:13:17', '1.6', '7.1', '12.1']]

我想找到每列的平均值,但不包括标题和时间作为计算的一部分,但保留标题作为输出并且只取小数点后一位。总的来说,我想制作这样的东西:

average_data_list=
[['','Header1','Header2','Header3'],
['', 2.3', '6.9', '12.4']]

我一直使用Python - Calculate average for every column in a csv file 作为指南,但我的代码不断抛出错误,因为我无法让它正确跳过标题和时间。

任何帮助将不胜感激

【问题讨论】:

    标签: python csv


    【解决方案1】:

    以下应该有效:

    import csv
    
    with open('data.csv', 'rb') as f:
        reader = csv.reader(f)
        header = next(reader)
        data_list = list(reader)
        rows = [''] + ['{:.1f}'.format(sum(float(x) for x in y) / len(data_list)) for y in zip(*data_list)[1:]]
        average_data_list = [header] + [rows]
    
        print average_data_list
    

    这将显示:

    [['', 'Header1', 'Header2', 'Header3'], ['', '2.4', '6.9', '12.4']]
    

    这里的诀窍是先读取标题行,以免妨碍它。 zip(*data_list) 用于将行列表转换为列列表,以便轻松计算平均值。

    【讨论】:

    • 有没有办法让平均值只保留小数点后一位?喜欢在某处正确合并%.1f
    • 确实,只需将str 替换为合适的format。我已经更新了答案。
    【解决方案2】:

    你可以试试:

    for i, row in enumerate(data_list):
        if i == 0:
             continue
    
        for j, value in enumerate(row):
            average_data_list[j] += value
    
    quantity = len(data_list) - 1
    for i, sum in enumerate(average_data_list):
        average_data_list[i] = sum / quantity
    

    首先,您首先将所有值相加到数组中;其次,您迭代计算其平均值的结果数组。

    另一种选择是在每一步创建数量和增量的数组,以防您想忽略 nulls

    【讨论】:

      【解决方案3】:

      这个怎么样。 a、b 和 c 汇总各列的总和。然后只除以行数减一(忽略标题行),只打印一个小数。

      a,b,c = 0,0,0
      for i, row in enumerate(data_list):
          if i != 0:
              a += float(row[1])
              b += float(row[2])
              c += float(row[3])
      
      num_vals = len(data_list) - 1 #because of the header
      a /= num_vals
      b /= num_vals
      c /= num_vals
      print "{0:.1f} , {1:.1f}, {2:.1f}".format(a,b,c)
      

      【讨论】:

        【解决方案4】:

        使用 Python 标准库中提供的 csvstatistics 模块很容易解决这个问题。以下示例使用 DictReader 类从 CSV 文件加载数据,同时使用列名旋转数据。使用mean 函数对列中的数据进行平均,而通过mapfloat 处理数据转换。

        #! /usr/bin/env python3
        import csv
        import statistics
        
        
        def main():
            with open('data.csv', newline='') as file:
                reader = csv.DictReader(file)
                column = {key: [] for key in reader.fieldnames}
                for row in reader:
                    for key in reader.fieldnames:
                        column[key].append(row[key])
            print('Header1 Average =', statistics.mean(map(float, column['Header1'])))
            print('Header2 Average =', statistics.mean(map(float, column['Header2'])))
            print('Header3 Average =', statistics.mean(map(float, column['Header3'])))
        
        
        if __name__ == '__main__':
            main()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-31
          • 2018-03-14
          • 2019-04-03
          • 2021-07-01
          相关资源
          最近更新 更多