迭代csv文件中的列以查找项目的出现次数 - PYTHON

时间:2017-03-15 22:09:59

标签: python csv duplicates counter

我在csv文件中有三列(Excel电子表格):

命名地点值

fal6s hlkshf8 alksj0

saljg h9ag80a ha8g9a

lak5f agk1h00 ha035a

等等(长数千个数据点)

列名称和地点中有重复项。

我想找到只有一个名字有多少个地方。

例如为了名字' algh9g0'我想计算标记了多少个地方

我想我需要使用Counter()或defaultdict()。

到目前为止,我有:

from  collections import Counter
with open('/Users/tb/Desktop/blah.csv', 'r') as f:
    EXP = csv.reader(f)
    HEADERS = next(EXP)     #skip over column titles
    for row in EXP:
        counts = Counter(row[1])     
        print counts ... for every unique name

但它没有给我我想要的东西。 我试图说:对于第1列中的每个名字,计算位于第2列的地点数。

它的印刷:

Counter({'6': 2, '9': 2, '8': 2, 'c': 1, 'e': 1, 'd': 1, 'f': 1, '0': 1, '7': 1})
好像它正在拆分物品。

谢谢

2 个答案:

答案 0 :(得分:0)

首先,您发布的代码存在错误,甚至无法运行。此外,如果您想保留一些总体计数,那么为每一行创建一个新Counter肯定是个问题。我还假设您的输入数据真的以逗号分隔;您粘贴的样本似乎是空格或制表符分隔。

如果我正确理解您的问题,您需要查看有多少个不同位置与单个名称相关联。我们的想法是,对于我们遇到的每个名称,我们会保留与其关联的set个地点。然后最后,我们遍历每个名​​称并打印地点集的大小。

import csv

name_places = {} # map from name to set of places

with open('input.csv', 'r') as f:
    EXP = csv.reader(f)
    HEADERS = next(EXP)
    for (name, place, value)  in EXP:
        name_places.setdefault(name, set())
        name_places[name].add(place)

for name, places in name_places.items():
    print('%s,%d' % (name, len(places)))

答案 1 :(得分:0)

我只会使用defaultdict而不使用csv阅读器:

data.csv

name place value
fal6s hlkshf8 alksj0
saljg h9ag80a ha8g9a
lak5f agk1h00 ha035a
lak5f agk1h00 ha035a
fal6s hlkshf8 alksj0
fal6s hlkshf8 alksj0
fal6s hlkshf8 alksj0

from collections import defaultdict

res = defaultdict(set)
with open('data.csv') as f:
    headers = next(f).split()
    for line in f:
        name, place, _ = line.split()
        res[name].add(place)

for name, places in res.iteritems():
    print name, len(places)

输出:

saljg 1
lak5f 2
fal6s 3