我是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导入模块,但是你喜欢。谢谢!
答案 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)
我建议将其分成几个较小的步骤:
这些步骤中的每一步都可以实现为两个单独的功能。 (在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 . .
;