2013-03-14 152 views
3

我有一個CSV數據集是這樣的:閱讀CSV文件,並創建字典

A, 10, USA 
B,30, UK 
C,4,IT 
A,20,UK 
B,10,USA 

我想讀這個CSV線,並提供以下的輸出:

A has ran 30 miles with average of 15. 
B has ran 30 miles with average of 20. 
C has ran 4 miles with average of 4. 

我的解決辦法爲止是讀取csv數據並將它們轉換爲字典,然後遍歷它們以查看「A」已重複多少次以及它必須計算的平均值以及最終的結果。我已經編寫了這些代碼,但是我很難有效地計算A被重複的次數,並累計裏數來創建我的最終輸出。任何想法在Python中做到這一點?在C#中這樣做對我來說很容易,但是我對Python不太好。

def main(filename): 
    f = open(filename,'r') 
    labels = ['name','miles','country'] 
    data = csv.DictReader(f,labels,delimiter=',') 
    for line in data: 
     print (line['name']+" " + "has ran" +" "+ line['miles']+" "+"miles") 

    f.close() 

回答

6

可以使用defaultdict存儲的值,然後打印出來:

import csv 

from collections import defaultdict 

with open(filename, 'r') as handle: 
    reader = csv.DictReader(handle, ['name', 'miles', 'country']) 
    data = defaultdict(list) 

    for line in reader: 
     data[line['name']).append(int(line['miles'])) 

    for runner, distances in data.items(): 
     print '{} ran a total of {} miles and an average of {} miles'.format(
      runner, sum(distances), sum(distances)/float(len(distances)) 
     ) 
+0

如果csv數據集中的行數超過1000,您認爲這是一個很好的解決方案嗎?我希望這個解決方案不是一個O(n^2),這會把事情搞砸。 – user843681 2013-03-14 02:45:00

+0

@ user843681:它是'O(n)'。您通過CSV迭代一次,然後遍歷結果打印出來。 – Blender 2013-03-14 02:46:06

1

我你的循環利用拆分如下:

VAR1,VAR2,VAR3 = line.split (「,」)

這會得到每個變量中每行的值。然後使用你喜歡的變量。

+0

Ops,我沒注意到你想計算平均值。 – JHS 2013-03-14 02:40:45

+0

是的,這是這裏的訣竅。它看起來很簡單,但如果你是Python的新手,它會特別抓住你。 – user843681 2013-03-14 02:43:54

1

你可以做到以下幾點:

  1. 添加標題行到您的數據(例如, 「亞軍,距離,國家」)。
  2. 將其保存到文件(例如,log.csv)。
  3. 與load_csv功能在此處裝入它:https://github.com/kdavies4/ModelicaRes/blob/master/modelicares/util.py#L676 通過下載util.py文件那裏,執行以下操作:

    d = {'Runner': ['A', 'B', 'C', 'A', 'B'], 'Distance': [10, 30, 4, 20, 10], 'Country': ['USA', 'UK', 'IT', 'UK', 'USA']} 
    

    from util import load_csv 
    d = load_csv("log.csv") 
    

    您應該具有以下詞典結束load_csv函數使用csv.reader自動創建一個字典,其中鍵名稱以它在標題行中找到的條目命名。每個鍵的字典條目是來自相應列的值的列表。文檔在這裏: http://kdavies4.github.io/ModelicaRes/util.html#modelicares.util.load_csv。 util.py文件包含很多其他功能,但您可以安全地刪除它們(只要您將import numpy as np保留在頂部)。

  4. 運行下面的代碼來計算的平均距離:

    # Create counter dictionaries for the statistics. 
    from collections import Counter 
    n_runs = Counter() 
    totals = Counter() 
    
    # Calculate the total distance. 
    for runner, distance in zip(d['Runner'], d['Distance']): 
        n_runs[runner] += 1 
        totals[runner] += distance 
    
    # Print the results. 
    for runner in set(d['Runner']): 
        print("%s has run %i miles with an average of %g." 
          % (runner, totals[runner], totals[runner]/float(n_runs[runner]))) 
    

這應該給你你想要的結果,如果數據擴展(通過行或列),它應該是靈活的。

Kevin