Fusionando dos archivos CSV usando Python

OK, he leído varios hilos aquí en Stack Overflow. Pensé que esto sería bastante fácil para mí, pero encuentro que todavía no tengo un buen conocimiento de Python. Probé el ejemplo ubicado en Cómo combinar 2 archivos csv con un valor de columna común, pero ambos archivos tienen un número diferente de líneas y eso fue útil, pero aún no tengo los resultados que esperaba lograr.

Esencialmente tengo 2 archivos csv con una primera columna común. Me gustaría fusionar el 2. ie

filea.csv

 título, etapa, jan, feb
 maldito, 3.001,0.421,0.532
 ok, 2.829,1.036,0.751
 tres, 1.115.1.146.2.921

fileb.csv

 título, mar, abril, mayo, junio
 maldito, 0.631,1.321,0.951,1.751
 ok, 1.001,0.247,2.456,0.3216
 tres, 0.285,1.283,0.924,956

output.csv (no el que estoy recibiendo sino lo que quiero)

 título, etapa, enero, febrero, marzo, abril, mayo, junio
 darn, 3.001,0.421,0.532,0.631,1.321,0.951,1.751
 ok, 2.829,1.036,0.751,1.001,0.247,2.456,0.3216
 tres, 1.115,1.146,2.921,0.285,1.283,0.924,956

output.csv (la salida que realmente obtuve)

 titulo, feb, mayo
 ok, 0.751,2.456
 tres, 2.921,0.924
 maldito, 0.532,0.951

El código que estaba intentando:

''' testing merging of 2 csv files ''' import csv import array import os with open('Z:\\Desktop\\test\\filea.csv') as f: r = csv.reader(f, delimiter=',') dict1 = {row[0]: row[3] for row in r} with open('Z:\\Desktop\\test\\fileb.csv') as f: r = csv.reader(f, delimiter=',') #dict2 = {row[0]: row[3] for row in r} dict2 = {row[0:3] for row in r} print str(dict1) print str(dict2) keys = set(dict1.keys() + dict2.keys()) with open('Z:\\Desktop\\test\\output.csv', 'wb') as f: w = csv.writer(f, delimiter=',') w.writerows([[key, dict1.get(key, "''"), dict2.get(key, "''")] for key in keys]) 

Cualquier ayuda es muy apreciada.

Cuando trabajo con archivos csv , a menudo uso la biblioteca de pandas . Hace cosas como esta muy fácil. Por ejemplo:

 import pandas as pd a = pd.read_csv("filea.csv") b = pd.read_csv("fileb.csv") b = b.dropna(axis=1) merged = a.merge(b, on='title') merged.to_csv("output.csv", index=False) 

Sigue alguna explicación. Primero, leemos en los archivos csv:

 >>> a = pd.read_csv("filea.csv") >>> b = pd.read_csv("fileb.csv") >>> a title stage jan feb 0 darn 3.001 0.421 0.532 1 ok 2.829 1.036 0.751 2 three 1.115 1.146 2.921 >>> b title mar apr may jun Unnamed: 5 0 darn 0.631 1.321 0.951 1.7510 NaN 1 ok 1.001 0.247 2.456 0.3216 NaN 2 three 0.285 1.283 0.924 956.0000 NaN 

y vemos que hay una columna de datos adicional (tenga en cuenta que la primera línea de fileb.csvtitle,mar,apr,may,jun, – tiene una coma adicional al final). Podemos deshacernos de eso fácilmente:

 >>> b = b.dropna(axis=1) >>> b title mar apr may jun 0 darn 0.631 1.321 0.951 1.7510 1 ok 1.001 0.247 2.456 0.3216 2 three 0.285 1.283 0.924 956.0000 

Ahora podemos fusionar b en la columna de título:

 >>> merged = a.merge(b, on='title') >>> merged title stage jan feb mar apr may jun 0 darn 3.001 0.421 0.532 0.631 1.321 0.951 1.7510 1 ok 2.829 1.036 0.751 1.001 0.247 2.456 0.3216 2 three 1.115 1.146 2.921 0.285 1.283 0.924 956.0000 

y finalmente escribir esto:

 >>> merged.to_csv("output.csv", index=False) 

productor:

 title,stage,jan,feb,mar,apr,may,jun darn,3.001,0.421,0.532,0.631,1.321,0.951,1.751 ok,2.829,1.036,0.751,1.001,0.247,2.456,0.3216 three,1.115,1.146,2.921,0.285,1.283,0.924,956.0 

Debe almacenar todas las filas adicionales en los archivos de su diccionario, no solo una de ellas:

 dict1 = {row[0]: row[1:] for row in r} ... dict2 = {row[0]: row[1:] for row in r} 

Luego, dado que los valores en los diccionarios son listas, solo necesita concatenar las listas juntas:

 w.writerows([[key] + dict1.get(key, []) + dict2.get(key, []) for key in keys])