2016-08-23 64 views
-5

假设我有这样找到值的平均值,在Python的方式符合条件的列

mpg cylinder 
14 4 
26 6 
45 4 
20 4 
23 8 
21 8 

的数据和我的输出应该是这样的

cylinder 4= 14+45+20/3 

dataset=[] 
f= open('auto-mpg-data.csv') 
csv_f=csv.reader(f) 
for row in csv_f: 
    dataset.append(row) 

#reading mpg column 
mpg=[] 
for row in dataset: 
    mpg.append(float(row[0])) 

#reading cylinder column 
cylinder=[] 
for row in dataset: 
    cylinder.append(float[row[1]) 

#calculating average with condition 
+1

而你的问题是...? – Julien

回答

0

使用sum和来计算条件的平均值很容易使用列表理解进行过滤后使用。例如,要计算平均mpg存在四个cylinders,你可以这样做:

mpg4cylinder = [m for m, c in zip(mpg, cylinder) if c == 4] 

# For greater precision with float summing, you may want to use math.fsum 
cylinder4avg = sum(mpg4cylinder)/len(mpg4cylinder) 

如果你使用Python的现代(3.4+),它甚至the statistics module简单:

cylinder4avg = statistics.mean(m for m, c in zip(mpg, cylinder) if c == 4) 

这比math.fsum方法更加精确,并且更加简洁,换来更慢。

如果你正在计算所有气瓶的统计数据,而不仅仅是一个或两个气瓶,那么效率会有些低下。你可以通过液压缸将它们分组对这个进步的。你去:

from collections import defaultdict 

cyl_to_mpgs = defaultdict(list) 
for m, c in zip(mpg, cylinder): 
    cyl_to_mpgs[c].append(m) 

现在,您可以得到任何给定的气缸数的平均值,而无需通过数据的整个列表搜索筛选出你想要的位,你只是做:

statistics.mean(cyl_to_mpgs[4.0]) 

它得到预过滤list便宜(在单次预过滤具有所有气缸组合起来前)。你可以更简洁地为你做很多工作。的dataset创建和人口可能只是:

# newline='' is the correct way to do csv in Py3; on Py2, you'd get rid of it 
# but provide a mode argument of "rb" 
with open('auto-mpg-data.csv', newline='') as f: 
    dataset = list(csv.reader(f)) 

mpg是:

mpg = [float(row[0]) for row in dataset] 

cylinder相同的模式。除append值之外什么都不做的循环通常最好用list构造函数或列表理解替代(如果list已经具有值,则可以使用与list/listcomps相同的参数或理解来调用extend)。

+0

你只是给出了整体平均值。我正在寻找具有类似气缸的平均MPG。像 圆柱体4 = 14 + 45 + 23/3圆柱体6 = 26和圆柱体8 = 21 + 23/2 – Cool

+0

@Cool:为什么圆柱体被解析为'float'如果它们是'int'?无论如何,我会更新。 – ShadowRanger