2016-06-13 10 views
0

情報が必要なcsvファイルに問題があります。以下は、私が何をする必要があるかです:CSV:別の列に特定の値がある場合、列の文字列を数える

私はこのように注文されたCSVファイルを持っている:

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

は今、私のpythonで何をしたいか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

関連する問題