Python - 计算csv文件中每列的平均值

时间:2014-09-01 00:21:41

标签: python csv multiple-columns

我是Python的新手,我正在尝试获取csv文件的每个(列或行)的平均值,然后选择高于其列的平均值(o行)的两倍的值。我的文件有数百列,并且具有如下的浮点值:

845.123,452.234,653.23,...
432.123,213.452.421.532,...
743.234,532,432.423,...

我已经对我的代码进行了多次更改以获得每列的平均值(单独),但目前我的代码就像这样:

def AverageColumn (c):
    f=open(csv,"r")
    average=0
    Sum=0
    column=len(f)
    for i in range(0,column):
        for n in i.split(','):
            n=float(n)
            Sum += n
        average = Sum / len(column)
    return 'The average is:', average

    f.close()


csv="MDT25.csv"
print AverageColumn(csv)

但我总是得到一个错误,例如“f has no len()”或“'int'对象不可迭代”......

如果有人告诉我如何获得每列(或行,你想要的)的平均值,然后选择高于其列(或行)平均值的两倍的值,我真的很感激。 。我宁愿不用csv导入模块,但是你喜欢。谢谢!

6 个答案:

答案 0 :(得分:4)

这是一个清理你的功能,但它可能不会做你想做的事情。 目前,它正在获取所有列中所有值的平均值:

def average_column (csv):
    f = open(csv,"r")
    average = 0
    Sum = 0
    row_count = 0
    for row in f:
        for column in row.split(','):
            n=float(column)
            Sum += n
        row_count += 1
    average = Sum / len(column)
    f.close()
    return 'The average is:', average

我会使用csv模块(这使得csv解析更容易),使用Counter对象来管理列总计,使用context manager来打开文件(不需要close()):

import csv
from collections import Counter

def average_column (csv_filepath):
    column_totals = Counter()
    with open(csv_filepath,"rb") as f:
        reader = csv.reader(f)
        row_count = 0.0
        for row in reader:
            for column_idx, column_value in enumerate(row):
                try:
                    n = float(column_value)
                    column_totals[column_idx] += n
                except ValueError:
                    print "Error -- ({}) Column({}) could not be converted to float!".format(column_value, column_idx)                    
            row_count += 1.0            

    # row_count is now 1 too many so decrement it back down
    row_count -= 1.0

    # make sure column index keys are in order
    column_indexes = column_totals.keys()
    column_indexes.sort()

    # calculate per column averages using a list comprehension
    averages = [column_totals[idx]/row_count for idx in column_indexes]
    return averages

答案 1 :(得分:2)

首先,正如人们所说 - CSV格式看起来很简单,但它可能非常重要,特别是一旦字符串进入游戏。 monkut已经为您提供了两个解决方案,清理后的代码版本以及另一个使用CSV库的解决方案。我还会给出另一个选择:没有库,但有大量惯用代码可以咀嚼,这样可以同时为所有列提供平均值。

def get_averages(csv):
    column_sums = None
    with open(csv) as file:
        lines = file.readlines()
        rows_of_numbers = [map(float, line.split(',')) for line in lines]
        sums = map(sum, zip(*rows_of_numbers))
        averages = [sum_item / len(lines) for sum_item in sums]
        return averages

注意事项:在您的代码中,f是一个文件对象。您已经返回值后尝试关闭它。永远不会达到此代码:处理return后没有执行任何操作,除非您有try...finally构造或with构造(就像我正在使用 - 它将自动关闭流)。

map(f, l)或同等的[f(x) for x in l]创建一个新列表,其元素是通过对f上的每个元素应用函数l获得的。

f(*l)将在函数调用之前“解包”列表l,将每个元素作为单独的参数赋予函数f

答案 2 :(得分:0)

如果你想在没有stdlib模块的情况下出于某种原因这样做:

with open('path/to/csv') as infile:
    columns = list(map(float,next(infile).split(',')))
    for how_many_entries, line in enumerate(infile,start=2):
        for (idx,running_avg), new_data in zip(enumerate(columns), line.split(',')):
            columns[idx] += (float(new_data) - running_avg)/how_many_entries

答案 3 :(得分:0)

我建议将其分成几个较小的步骤:

  1. 将CSV文件读入2D列表或2D阵列。
  2. 计算每列的平均值。
  3. 这些步骤中的每一步都可以实现为两个单独的功能。 (在CSV文件较大的实际情况下,由于空间限制,将完整文件读入内存可能会令人望而却步。但是,对于学习练习,这是了解编写自己的函数的好方法。)< / p>

答案 4 :(得分:0)

我希望这可以帮助你......有些帮助......这就是我要做的 - 这是使用numpy:

    # ==========================
    import numpy as np
    import csv as csv

    #  Assume that you have 2 columns and a header-row: The Columns are (1) 
    #  question # ...1; (2) question 2
    # ========================================

    readdata = csv.reader(open('filename.csv', 'r'))  #this is the file you 
    # ....will write your original file to....============
    data = []
    for row in readdata:
    data.append(row)
    Header = data[0]
    data.pop(0)
    q1 = []
    q2 = []
    # ========================================

    for i in range(len(data)):
        q1.append(int(data[i][1]))
        q2.append(int(data[i][2]))
    # ========================================
    # ========================================
    # === Means/Variance - Work-up Section ===
    # ========================================
    print ('Mean - Question-1:            ', (np.mean(q1)))
    print ('Variance,Question-1:          ', (np.var(q1)))
    print ('==============================================')
    print ('Mean - Question-2:            ', (np.mean(q2)))
    print ('Variance,Question-2:          ', (np.var(q2)))

答案 5 :(得分:0)

这绝对对我有用!

data want ;
  input id c1 :$10. c2 :$char10. ;
cards;
1 a b 
2 . .
;