命名地点值
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})
好像它正在拆分物品。
谢谢
答案 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阅读器:
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