我刚开始学习python。 我很想知道在CSV文件中计算特定单词出现的有效方法是什么,而不是简单地使用for循环逐行进行读取。
更具体地说,假设我有一个CSV文件包含两列,“名称”和“等级”,有数百万条记录。
如何计算“等级”下“A”的出现次数?
非常感谢Python代码示例!
答案 0 :(得分:9)
基本示例,使用标准Python库中的csv
和collections.Counter
(Python 2.7+):
import csv
import collections
grades = collections.Counter()
with open('file.csv') as input_file:
for row in csv.reader(input_file, delimiter=';'):
grades[row[1]] += 1
print 'Number of A grades: %s' % grades['A']
print grades.most_common()
输出(对于小数据集):
Number of A grades: 2055
[('A', 2055), ('B', 2034), ('D', 1995), ('E', 1977), ('C', 1939)]
答案 1 :(得分:2)
您当然应该阅读所有成绩,在这种情况下也意味着阅读整个文件。您可以使用csv
模块轻松读取逗号分隔值文件:
import csv
my_reader = csv.reader(open('my_file.csv'))
ctr = 0
for record in my_reader:
if record[1] == 'A':
ctr += 1
print(ctr)
这非常快,我使用Counter
方法无法做得更好:
from collections import Counter
grades = [rec[1] for rec in my_reader] # generator expression was actually slower
result = Counter(grades)
print(result)
最后但并非最不重要的是,列表包含count
方法:
from collections import Counter
grades = [rec[1] for rec in my_reader]
result = grades.count('A')
print(result)
答案 2 :(得分:2)
正如您所看到的,有很多方法可以解决这个问题。
评估速度的最佳方法是使用timeit
计时。例如:
% python -m timeit -c 'import csv
with open("./grades.csv") as grades:
table = csv.DictReader(grades)
sum(1 for row in table if row["Grade"] == "A")
'
10000 loops, best of 3: 129 usec per loop