用Python计算大数据集中邮政编码的出现次数

时间:2015-11-18 01:32:56

标签: python csv counter zipcode

我是一个蟒蛇新手,想要计算几个.csv文件(6+)中最常出现的100个邮政编码。数据集中有300万个+邮政编码,而我正在寻找一种方法来只提取最常出现的前100个。下面的代码示例来自另一篇文章,虽然我试图计算几个.csv文件。提前致谢!

import csv
import collections

zip = collections.Counter()
with open('zipcodefile1.csv', 'zipcodefile2.csv', 'zipcodefile3.csv') as input file:
   for row in csv.reader(input_file, delimiter=';'):
       ZIP[row[1]] += 1

print ZIP.most_common(100)

1 个答案:

答案 0 :(得分:1)

我建议在这里使用Python的生成器,因为它们会很好而且高效。首先,假设我们有两个文件:

zc1.txt

something;00001
another;00002
test;00003

zc2.txt

foo;00001
bar;00001
quuz;00003

现在让我们编写一个函数,它接受多个文件名并遍历文件的 all 中的行,只返回邮政编码:

import csv

def iter_zipcodes(paths):
    for path in paths:
        with open(path) as fh:
            for row in csv.reader(fh, delimiter=';'):
                yield row[1]

请注意,我们会写yield row[1]。这表示该函数是生成器,并且它会懒惰地返回其值。

我们可以按如下方式测试:

>>> list(iter_zipcodes(['zc1.txt', 'zc2.txt']))
['00001', '00002', '00003', '00001', '00001', '00003']

因此我们看到生成器只是按顺序吐出每个文件中的邮政编码。现在让我们算一下:

>>> zipcodes = iter_zipcodes(['zc1.txt', 'zc2.txt'])
>>> counts = collections.Counter(zipcodes)
>>> counts
Counter({'00001': 3, '00002': 1, '00003': 2})

看起来很有效。这种方法很有效,因为它一次只读取一行。当一个文件被完全读取时,它会移动到下一个文件。