2016-06-13 67 views
0

我遇到了需要某些信息的csv文件的问题。以下是我需要做的:CSV:如果另一列具有特定值,则计算列中的字符串

我有一个有序的这样一个CSV文件:

bla country bla bla value 
    Germany    Y 
    Germany    Y 
    Germany    N 
    Denmark    N 
    Denmark    N 
    Denmark    Y 

现在我想与蟒蛇做的是每个Y值是在同一时间计数柱。所以最后我得到了像德国这样的东西:2丹麦:1。

但是我只能够弄清楚如何使用下面的代码数列:

import csv 
from collections import Counter, defaultdict 
from itertools import imap 
from operator import itemgetter 



header_counter = defaultdict(Counter) 

with open('airlines.csv') as input_file: 
    r = csv.reader(input_file, delimiter=',') 

    headers = next(r) 
    for row in r: 

     row_val = sum([w.isdigit() for w in row]) 

     for header, val in zip(headers, row): 

      if not any(map(str.isdigit, val)): 
       header_counter[header].update({val: row_val}) 


for k, v in header_counter.iteritems(): 
    print k, v 

我甜甜圈认为上面的代码是多大用处的人,虽然,因为它只能算作行每列并过滤掉整数。我能得到的任何帮助都非常感激,我仍然很缺乏经验。

回答

0

我觉得@ smarx的答案是最美丽的方式来做到这一点。这里是一个更详细和实用的方法:

import csv 

d = {} 

with open('airlines.csv', 'r') as f: 
    # Sniff the CSV dialect 
    dialect = csv.Sniffer().sniff(f.read(1024)) 

    # Move back to beginning of file 
    f.seek(0) 

    # DictReader uses the first row in the file as headers. 
    r = csv.DictReader(f, dialect=dialect) 

    # Plain iteration and counting in a normal dict. 
    for row in r: 
     # Plain incrementation of the "country" by one if "value" is 
     # 'Y' 
     if row['value'] == 'Y': 
      d[row['country']] = d.get(row['country'], 0) + 1 

for k in d: 
    print('{} => {}'.format(k, d[k])) 
+0

非常感谢!我选择它作为最佳答案,但因为我可以复制粘贴它。当谈到这个问题时,我是一个初学者,所以它非常有帮助,但是我仍然想知道我在哪里可以找到一个教程,我如何处理这个问题,因为我可能会更频繁地这样做。我明白你的代码的作用,但我真的不知道该如何自己写。 – cinderashes

1

这是你在找什么?

import csv 
from collections import Counter 

data = '''country,value 
Germany,Y 
Germany,Y 
Germany,N 
Denmark,N 
Denmark,N 
Denmark,Y''' 

r = csv.DictReader(data.split('\n')) 

counter = Counter(
    row.get('country') 
    for row in r 
    if row.get('value') == 'Y') 

for k, v in counter.items(): 
    print('{}: {}'.format(k, v)) 
+0

非常感谢最初我与此并可以实施它很快。 – cinderashes

相关问题