Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-计算csv文件中每列的平均值_Python_Csv_Multiple Columns - Fatal编程技术网

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

Python-计算csv文件中每列的平均值,python,csv,multiple-columns,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

我是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没有len()”或“int”对象不可iterable”


如果有人告诉我如何获得每个列(或行,如您所愿)的平均值,然后选择高于其列(或行)平均值两倍的值,我将不胜感激。我宁愿不将模块作为csv导入,而是按照您的喜好导入。谢谢

这里是对函数的清理,但它可能无法完成您希望它完成的任务。 目前,它正在获取所有列中所有值的平均值:

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解析更容易),使用一个对象来管理列总数,并使用一个打开文件(不需要
close()
):


如果出于某种原因,您希望在不使用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

首先,正如人们所说的-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
是一个文件对象。在返回值后尝试关闭它。此代码永远不会到达:除非您有一个
try…finally
构造或
with
构造(就像我正在使用的-它将自动关闭流),否则在处理
返回后不会执行任何操作

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


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

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

  • 将CSV文件读入二维列表或二维数组
  • 计算每列的平均值

  • 这些步骤中的每一步都可以实现为两个独立的功能。(在CSV文件较大的实际情况下,由于空间限制,将整个文件读入内存可能会受到限制。但是,对于学习练习来说,这是了解编写自己函数的一个好方法。)我希望这能帮到你……一些帮助……以下是我要做的事情——使用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)))
    

    这对我来说绝对有效

    import numpy as np
    import csv
    
    readdata = csv.reader(open('C:\\...\\your_file_name.csv', 'r'))
    data = []
    
    for row in readdata:
      data.append(row)
    
    #incase you have a header/title in the first row of your csv file, do the next line else skip it
    data.pop(0) 
    
    q1 = []  
    
    for i in range(len(data)):
      q1.append(int(data[i][your_column_number]))
    
    print ('Mean of your_column_number :            ', (np.mean(q1)))
    

    为什么不想使用stdlib模块(例如,
    csv
    ?)@AdamSmith:modules可以解决问题。“不做任何事都会教你如何编码。@阿玛丹,我从来没有理解过这种观点。如果你真的相信,你不会考虑任何解释性的语言“编码”,可能会要求自己编译你自己的编译器,或者简单地写机器代码。要学习Python的基础知识,您应该编写Python的基础知识。库不会教你在
    return
    之后不写东西,也不会教你如何使用数组同时进行多个计算。谢谢,我很感激,但我得到了这个错误:行数=[map(float,line.split(',')for line in line]ValueError:无法将字符串转换为float:Ok,我发现了错误,这是因为最后一列是不同的。最好告诉OP为什么这对您有效。很简单,我的csv有5列,第一行包含列的标题,最初我读取csv文件,将每行存储到numpy数组(数据[]),然后我弹出包含标题(非数值)的第一行在计算平均值时不引起误差。取一个新的numpy数组(q1[]),它是我想要的特定列的平均值,并通过numpy包的内置平均值函数计算平均值
    import numpy as np
    import csv
    
    readdata = csv.reader(open('C:\\...\\your_file_name.csv', 'r'))
    data = []
    
    for row in readdata:
      data.append(row)
    
    #incase you have a header/title in the first row of your csv file, do the next line else skip it
    data.pop(0) 
    
    q1 = []  
    
    for i in range(len(data)):
      q1.append(int(data[i][your_column_number]))
    
    print ('Mean of your_column_number :            ', (np.mean(q1)))