2014-04-27 73 views
0

我有以下格式的数据文件:阅读并汇总数据

name,cost1,cost1,cost1,cost2,cost3,cost3, 
X,2,4,6,5,6,8, 
Y,0,3,6,5,4,6, 
. 
. 
.... 

现在,我想这样做是将其转换为词典的词典,使得

{'X', {'cost1': 4, 'cost2':5, 'cost3':7}},{'Y', {'cost1': 3, 'cost2':5, 'cost3':5}}.... 

其中每个键的值是来自数据文件的平均值。这怎么能做到?根据@ cphlewis的方向

+0

看看Python的['csv'](https://docs.python.org/2/library/csv .html)模块。它在文档中有一些很好的例子。 –

+0

这是很好的知道,你想达到什么,但你也应该在你问StackOverflow之前做你自己的研究。 –

+0

@Jan Vlcinsky:我做到了。我只是不确定什么是最干脆的做法!更重要的是,我认为这可能对更多人有用,因为它不是微不足道的(至少对我来说)。 – suzee

回答

0

更宽泛的版本:

load_data = csv.reader(open("multientry.csv", "r")) 
header = next(load_data) 
header = filter(bool,header) 
categories = header 
categories.pop(0) 
categories = set(categories) 
dofd={} 
for row in load_data: 
    row = filter(bool,tuple(value for value in row)) 
    dofd[row[0]]={} 
    for item in categories: 
     val = [float(k) for k in [row[i+1] for i in [i for i, x in enumerate(header) if x == item]]] 
     dofd[row[0]][item] = sum(val)/float(len(val)) 
+0

很酷。你玩过迈克尔上面提到的csv.DictReader吗?它为处理您事先不知道的色谱柱排列提供了一种不同的灵活性。可能更长但易于阅读的代码。 – cphlewis

+0

@cphlewis:我没有。但是,我提出的代码是独立的列排列。它将与任何列的顺序一起工作 – suzee

1
import csv 
types = [str, float, float, float, float, float, float]            

with open('multientry.csv') as f: 
    data = csv.reader(f, delimiter=',') 
    headers = next(data) 
    dofd = {} 
    for r in data: 
     r = tuple(convert(value) for convert, value in zip(types, r)) 
     dofd[r[0]] = {} 
     dofd[r[0]]['cost1'] = (r[1]+r[2]+r[3])/3. 
     dofd[r[0]]['cost2'] = r[4] 
     dofd[r[0]]['cost3'] = (r[5]+r[6])/2. 


print dofd 
+0

csv.DictReader可以执行相同的内置操作,无需安装额外的库。 – Michael

+0

好点@迈克尔!虽然我没有拿出DictReader结果更可读的用法。如果列顺序不可预测,那当然是值得的。 – cphlewis

+0

@cphlewis:谢谢。我在你的路线上编了一个更通用的版本。 – suzee