2013-03-14 150 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