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.csv
– title,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])