Discussione:
[Python] unire dati da due csv
unknown
2010-10-16 09:46:01 UTC
Permalink
Salve Lista,

vorrei unire dati appartenenti a due csv.reader che leggo così:

coordReader = csv.reader(open('invitations-coord.txt', 'rb'), delimiter=';', quotechar='|')

nodesReader = csv.reader(open('invitations-nodes.txt', 'rb'), delimiter=';', quotechar='|')

sulla base della prima colonna di ogni reader, che contiene il medesimo insieme di nomi univoci, vorrei creare un nuovo csv che incorpori i dati di coordReader e nodesReader.

Grazie in anticipo per ogni aiuto/suggerimento!

cordialmente,
Simone
unknown
2010-10-16 10:02:39 UTC
Permalink
2010/10/16 Simone Gabbriellini <simone.gabbriellini a gmail.com>
Post by unknown
Salve Lista,
Salve Simone :-)
Post by unknown
coordReader = csv.reader(open('invitations-coord.txt', 'rb'),
delimiter=';', quotechar='|')
nodesReader = csv.reader(open('invitations-nodes.txt', 'rb'),
delimiter=';', quotechar='|')
sulla base della prima colonna di ogni reader, che contiene il medesimo
insieme di nomi univoci, vorrei creare un nuovo csv che incorpori i dati di
coordReader e nodesReader.
Qualche domanda per darti una risposta più sensata:
1) quante righe hanno i due file?
2) i nomi univoci sono nello stesso ordine?
3) vuoi un csv che abbia un numero di colonne pari alla somma dei due csv
iniziali?


Ciao.
Marco.
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20101016/bc69c03a/attachment.htm
unknown
2010-10-16 12:53:18 UTC
Permalink
Ciao,

Grazie dell'aiuto!

Dunque le righe sono circa 500, i nomi non sono nello stesso ordine (ecco il mio principale problema), e quello che vorrei è un csv con le colonne pari alla somma di quelle dei due csv di partenza meno una, quella dei nomi che non vorrei replicare.

Grazie,
Simone

Sent from my iPhone
Post by unknown
2010/10/16 Simone Gabbriellini <simone.gabbriellini a gmail.com>
Salve Lista,
Salve Simone :-)
coordReader = csv.reader(open('invitations-coord.txt', 'rb'), delimiter=';', quotechar='|')
nodesReader = csv.reader(open('invitations-nodes.txt', 'rb'), delimiter=';', quotechar='|')
sulla base della prima colonna di ogni reader, che contiene il medesimo insieme di nomi univoci, vorrei creare un nuovo csv che incorpori i dati di coordReader e nodesReader.
1) quante righe hanno i due file?
2) i nomi univoci sono nello stesso ordine?
3) vuoi un csv che abbia un numero di colonne pari alla somma dei due csv iniziali?
Ciao.
Marco.
_______________________________________________
Python mailing list
Python a lists.python.it
http://lists.python.it/mailman/listinfo/python
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20101016/3c320c83/attachment.htm
unknown
2010-10-16 11:24:41 UTC
Permalink
Post by unknown
sulla base della prima colonna di ogni reader, che contiene il medesimo insieme di nomi univoci, vorrei creare un nuovo csv che incorpori i dati di coordReader e nodesReader.
Potresti essere un po' piu` specifico?

Mi sembra di capire che tu abbia tue CSV tipo:

CSV1:
nome, anni
pippo, 30
franco, 60

CSV2:
nome, capelli
pippo, 5834
franco, 312

e tu voglia come risultato:

CSV_out
nome, anni, capelli
pippo, 30, 5834
franco, 60, 312

Corretto?

in questo caso, se :
- la prima colonna e` fatta da nomi unici
- il numero di righe e` lo stesso
- le righe sono nello stesso ordine

allora una soluzione potrebbe essere:

def csv_merge(csvr_a, csvr_b, csvw_out):
for row_a, row_b in zip(csvr_a, csvr_b):
csvw_out.writerow(row_a + row_b[1:])

csv_out = csv.writer(open('csv_out.txt', "w+"))
csv_merge(coordReader, nodesReader, csv_out)


Ciao,
Andrea
unknown
2010-10-16 12:12:05 UTC
Permalink
Post by unknown
csvw_out.writerow(row_a + row_b[1:])
csv_out = csv.writer(open('csv_out.txt', "w+"))
csv_merge(coordReader, nodesReader, csv_out)
Suggerisco anche itertools.izip al posto di zip nel caso di un grande numero di righe.

Ciao.
Marco.
unknown
2010-10-16 15:33:19 UTC
Permalink
Ciao,
Post by unknown
CSV_out
nome, anni, capelli
pippo, 30, 5834
franco, 60, 312
Corretto?
è corretto, però nel mio caso la lista dei nomi nei due csv non ha lo stesso ordine. potrei ordinarle però prima di iniziare il merge?

ciao,
simone
unknown
2010-10-16 16:59:38 UTC
Permalink
Post by unknown
è corretto, però nel mio caso la lista dei nomi nei due csv non ha lo stesso ordine. potrei ordinarle però prima di iniziare il merge?
No, ordinarli prende tempo, e probabilmente il doppio della memoria,
se non sono tantissime righe (x colonne) conviene salvare un csv
(quello con meno colonne) tutto in memoria e poi iterare sul secondo e
scrivere al volo sul csv


def csv_merge(csvr_a, csvr_b, csvw_out):
a_dict = {}
a_fieldnames = None
for row_a in csvr_a:
if a_fieldnames == None:
a_fieldnames = row_a
else:
a_dict[row_a[0]] = row_a

b_fieldnames = None
for row_b in csvr_b:
if b_fieldnames == None:
b_fieldnames = row_b
csvw_out.writerow(a_fieldnames + b_fieldnames[1:])
else:
csvw_out.writerow(a_dict[row_b[0]] + row_b[1:])

csv_out = csv.writer(open('out.txt', "w+"))
csv_merge(coordReader, nodesReader, csv_out)



se dai come primo parametro il csv con meno colonne è meglio.
--
Andrea
unknown
2010-10-18 13:00:20 UTC
Permalink
Il problema è che csv.reader ti ritorna un tipo di oggetto iterabile,
che non è l'ideale per fare i merge e lavorare con tabelle come vuoi
fare tu. Per me csv è una libreria da utilizzare a basso livello, ma
per lavorare con dati in forma di tabella ci sono almeno tre
alternative efficenti in python.

La prima passa per numpy e il pacchetto di librerie scientifiche di python.
Prova ad utilizzare numpy.recfromtxt, numpy.recfromcsv o
numpy.genfromtxt al posto di csv.reader, per leggere files csv.
Post by unknown
from numpy import genfromtxt
coords = numpy.recfromtxt("invitations-coord.txt", names=True, delimiter=';', quotechar='|')
coords['x'] # assumendo che in "invitations-coord.txt" vi sia una colonna chiamata "x"
[lista di tutti i valori della colonna x]

I recarray hanno diversi vantaggi, in termini di efficienza di memoria
e facilitá di utilizzo, rispetto a liste e dizionari di python (per
lavorare con file tabulari).

Da qui, se ho ben capito tu vuoi fare un JOIN come in SQL. Non so bene
quale sia la funzione esatta per farlo con numpy, ma ti puoi ispirare
alla funzione join_by qui:
- http://pyopengl.sourceforge.net/pydoc/numpy.lib.recfunctions.html

Un altro sistema è appoggiarsi ad un sistema SQL, ovvero caricare il
CSV con python, transformarlo in una tabella SQL (SQLite per esempio)
e fare il join tramite il DBMS... se hai grandi quantitá di dati,
questo sistema puó essere piuttosto efficente, perchè un qualsiasi
DBMS è in grado di effettuare operazioni di JOIN nativamente.

Adesso peró non ti saprei dire quale libreria utilizzare... ti
potresti ispirare da: http://www.daniweb.com/forums/thread297790.html

Purtroppo è da tempo che ho abbandonato l'idea di utilizzare python
per lavorare con dati di tipo tabulare, perchè è troppo scomodo.
Preferisco utilizzare R e la funzione merge integrata nativamente
(http://rss.acs.unt.edu/Rdoc/library/base/html/merge.html).
Tra l'altro, esiste anche Rpy2, una libreria per chiamare funzioni di
R da python, posto che tu abbia installato entrambi gli interpreti.
Post by unknown
Salve Lista,
coordReader = csv.reader(open('invitations-coord.txt', 'rb'), delimiter=';', quotechar='|')
nodesReader = csv.reader(open('invitations-nodes.txt', 'rb'), delimiter=';', quotechar='|')
sulla base della prima colonna di ogni reader, che contiene il medesimo insieme di nomi univoci, vorrei creare un nuovo csv che incorpori i dati di coordReader e nodesReader.
Grazie in anticipo per ogni aiuto/suggerimento!
cordialmente,
Simone
_______________________________________________
Python mailing list
Python a lists.python.it
http://lists.python.it/mailman/listinfo/python
--
Giovanni Dall'Olio, phd student
Department of Biologia Evolutiva at CEXS-UPF (Barcelona, Spain)

My blog on bioinformatics: http://bioinfoblog.it
unknown
2010-10-18 13:20:00 UTC
Permalink
Il giorno 18 ottobre 2010 15:00, Giovanni Marco Dall'Olio <
Post by unknown
Un altro sistema è appoggiarsi ad un sistema SQL, ovvero caricare il
CSV con python, transformarlo in una tabella SQL (SQLite per esempio)
e fare il join tramite il DBMS... se hai grandi quantitá di dati,
questo sistema puó essere piuttosto efficente, perchè un qualsiasi
DBMS è in grado di effettuare operazioni di JOIN nativamente.
Concordo pienamente...
Recentemente sto facendo un lavoro proprio in questo modo.
Porto le tabelle CSV in SQLite e da li faccio tutti i MERGE che mi
interessano.
E' il metodo più comodo in assoluto...
Post by unknown
Purtroppo è da tempo che ho abbandonato l'idea di utilizzare python
per lavorare con dati di tipo tabulare, perchè è troppo scomodo.
Preferisco utilizzare R e la funzione merge integrata nativamente
(http://rss.acs.unt.edu/Rdoc/library/base/html/merge.html).
Tra l'altro, esiste anche Rpy2, una libreria per chiamare funzioni di
R da python, posto che tu abbia installato entrambi gli interpreti.
Ultimamente sto guardando anche io R. Molto interessante soprattutto perchè
all'università usavo Matlab...
Peccato che manca sempre il tempo :-)
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20101018/e6b40f66/attachment.htm
unknown
2010-10-20 15:16:24 UTC
Permalink
grazie a tutti dell'aiuto, scusate il ritardo nella risposta ma l'influenza m'ha tenuto "occupato"...

credo che utilizzerò direttamente R, seguendo il consiglio di Giovanni.

molte grazie,
Simone
Post by unknown
Un altro sistema è appoggiarsi ad un sistema SQL, ovvero caricare il
CSV con python, transformarlo in una tabella SQL (SQLite per esempio)
e fare il join tramite il DBMS... se hai grandi quantitá di dati,
questo sistema puó essere piuttosto efficente, perchè un qualsiasi
DBMS è in grado di effettuare operazioni di JOIN nativamente.
Concordo pienamente...
Recentemente sto facendo un lavoro proprio in questo modo.
Porto le tabelle CSV in SQLite e da li faccio tutti i MERGE che mi interessano.
E' il metodo più comodo in assoluto...
Purtroppo è da tempo che ho abbandonato l'idea di utilizzare python
per lavorare con dati di tipo tabulare, perchè è troppo scomodo.
Preferisco utilizzare R e la funzione merge integrata nativamente
(http://rss.acs.unt.edu/Rdoc/library/base/html/merge.html).
Tra l'altro, esiste anche Rpy2, una libreria per chiamare funzioni di
R da python, posto che tu abbia installato entrambi gli interpreti.
Ultimamente sto guardando anche io R. Molto interessante soprattutto perchè all'università usavo Matlab...
Peccato che manca sempre il tempo :-)
_______________________________________________
Python mailing list
Python a lists.python.it
http://lists.python.it/mailman/listinfo/python
Loading...