Mam CSV kodów pocztowych, które są powiązane z identyfikatorem. Istnieje wiele różnych kodów pocztowych przypisanych do tego samego identyfikatora w oddzielnych wierszach. Moje wejście wygląda tak:

ID      Postal Code  
1001    MK18 1TN
1001    MK18 1TL
1002    HP17 6DG
1002    HP17 6DH

Chcę stworzyć wiersz dla każdego unikalnego identyfikatora i wyświetla wszystkie powiązane kody pocztowe dostępne dla tego identyfikatora.

Wyjście, które jestem po podobnym do tego:

ID    Postal Codes
1001  MK18 1TN, MK18 1TL
1002  HP17 6DG, HP17 6DH

Czy ktoś ma jakieś zalecenia, jak osiągnął to w Pythonie lub SQL?

0
andyp 13 sierpień 2014, 17:29

2 odpowiedzi

Najlepsza odpowiedź

Przykład Pythona może być:

#ID      Postal Code  
data = [
    ('1001', 'MK18 1TN'),
    ('1001', 'MK18 1TL'),
    ('1002', 'HP17 6DG'),
    ('1002', 'HP17 6DH'),
    ]
d = dict()
for id,pc in data:
    if id not in d:
        d[id] = []
    d[id].append(pc)
idkeys = d.keys()
idkeys.sort()
for k in idkeys:
    print k, ', '.join(d[k])
0
Toby 13 sierpień 2014, 13:41

Jest wiele sposobów w Pythonie, np. Użyj CSV moduł do odczytu wkładu (zakładając, że karta jest DELIMEN) i grupuj go przy użyciu itertools.groupby() lub collections.defaultdict(list). Tutaj jest z groupby().

import csv
from itertools import groupby

with open('postcodes.csv') as infile, open('result.csv', 'w') as outfile:
    reader = csv.reader(infile, delimiter='\t')
    writer = csv.writer(outfile, delimiter='\t')
    writer.writerow(next(reader))     # copies the column headers into the output CSV
    for _id, postcodes in groupby(reader, lambda row: row[0]):
        writer.writerow([_id, ', '.join(postcode[1] for postcode in postcodes)])
0
mhawke 13 sierpień 2014, 14:07