阅读CSV文件,并创建字典
我有一个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()
可以使用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))
)
我你的循环利用拆分如下:
VAR1,VAR2,VAR3 = line.split (“,”)
这会得到每个变量中每行的值。然后使用你喜欢的变量。
Ops,我没注意到你想计算平均值。 – JHS 2013-03-14 02:40:45
是的,这是这里的诀窍。它看起来很简单,但如果你是Python的新手,它会特别抓住你。 – user843681 2013-03-14 02:43:54
你可以做到以下几点:
- 添加标题行到您的数据(例如, “亚军,距离,国家”)。
- 将其保存到文件(例如,log.csv)。
-
与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
保留在顶部)。 -
运行下面的代码来计算的平均距离:
# 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
如果csv数据集中的行数超过1000,您认为这是一个很好的解决方案吗?我希望这个解决方案不是一个O(n^2),这会把事情搞砸。 – user843681 2013-03-14 02:45:00
@ user843681:它是'O(n)'。您通过CSV迭代一次,然后遍历结果打印出来。 – Blender 2013-03-14 02:46:06