2014-04-27 71 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