Python-计算csv文件中每列的平均值
我是Python新手,我尝试获取csv文件的每个(列或行)的平均值,然后选择高于其列(o行)平均值两倍的值。我的文件有数百列,并且有如下浮点值: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
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)))