2016-06-13 28 views
0

Ich habe ein Problem mit einer CSV-Datei, wo ich einige Informationen benötigen. Im Folgenden ist das, was ich tun muss:CSV: Zählen einer Zeichenfolge in einer Spalte, wenn eine andere Spalte einen bestimmten Wert hat

Ich habe eine CSV-Datei, die wie folgt bestellt:

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

Nun, was ich mit Python tun möchte, ist in der gleichen jedes Mal der Y-Wert zu zählen Säule. Am Ende bekomme ich so etwas wie Deutschland: 2 Dänemark: 1.

aber ich habe nur in der Lage gewesen, um herauszufinden, wie die Spalten zu zählen, mit dem folgenden Code:

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 

Ich denke, Donut der obige Code von großem Nutzen für jeden ist aber, wie es nur die Zeilen zählt pro Spalten und filtert ganze Zahlen heraus. Jede Hilfe, die ich bekommen kann, ist sehr geschätzt, ich bin immer noch ziemlich unerfahren.

Antwort

0

Ich denke @ smarx's Antwort ist der schönste Weg, es zu tun. Hier ist ein ausführlicher und pragmatischer Ansatz:

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

Vielen Dank! Ich wählte es jedoch als beste Antwort, weil ich es einfach kopieren konnte. Ich bin ein bisschen Anfänger, wenn es darum geht, also war es sehr hilfreich, aber ich möchte immer noch wissen, wo ich ein Tutorial finden kann, wie ich damit arbeite, weil ich das wahrscheinlich öfter machen werde. Ich verstehe, was dein Code macht, aber ich weiß nicht wirklich, wie ich es selbst schreiben soll. – cinderashes

1

Ist das wonach Sie suchen?

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

Vielen Dank zuerst ging ich mit diesem und konnte es schnell implementieren. – cinderashes

Verwandte Themen