Tengo 2 archivos CSV: 'Datos' y 'Mapeo':
- Archivo 'Mapping' tiene 4 columnas:
Device_Name
,GDN
,Device_Type
, yDevice_OS
. Las cuatro columnas están pobladas. - El archivo 'Datos' tiene estas mismas columnas, con la
Device_Name
columna poblada y las otras tres columnas en blanco. - Quiero que mi código Python para abrir los archivos y para cada uno
Device_Name
en el archivo de datos, mapa suGDN
,Device_Type
yDevice_OS
el valor del archivo de asignación.
Sé cómo usar dict cuando solo hay 2 columnas presentes (se necesita 1 para mapear) pero no sé cómo lograr esto cuando se necesitan mapear 3 columnas.
A continuación se muestra el código con el que intenté realizar la asignación de Device_Type
:
x = dict([])
with open("Pricing Mapping_2013-04-22.csv", "rb") as in_file1:
file_map = csv.reader(in_file1, delimiter=',')
for row in file_map:
typemap = [row[0],row[2]]
x.append(typemap)
with open("Pricing_Updated_Cleaned.csv", "rb") as in_file2, open("Data Scraper_GDN.csv", "wb") as out_file:
writer = csv.writer(out_file, delimiter=',')
for row in csv.reader(in_file2, delimiter=','):
try:
row[27] = x[row[11]]
except KeyError:
row[27] = ""
writer.writerow(row)
Vuelve Attribute Error
.
Después de investigar un poco, creo que necesito crear un dict anidado, pero no tengo idea de cómo hacerlo.
Device_Name
La columna es la clave en ambos archivos, en esta clave quiero asignar los valores Device_OS, GDN y Device_Type del archivo de asignación al archivo de datos.row[27] = x[row[11]]["Device_OS"]
?Device_Name
el índice, luego puede directamentejoin
los dos marcos de datos en su índiceDevice_Name
.Respuestas:
Un dict anidado es un diccionario dentro de un diccionario. Una cosa muy simple.
También puede usar a
defaultdict
desde elcollections
paquete para facilitar la creación de diccionarios anidados.Puedes llenar eso como quieras.
Recomendaría en su código algo como lo siguiente:
De acuerdo a tu comentario :
Mi sugerencia sería algo como esto (sin usar defaultdict):
Sin embargo, tenga en cuenta que para analizar archivos csv hay un módulo csv .
fuente
a.csv
b.csv
,a.csv
tiene 4 columnasi j k l
,b.csv
también tiene estas columnas.i
es una especie de columnas clave para estos csvs '.j k l
la columna está vacíaa.csv
pero llena enb.csv
. Quiero asignar valores dej k l
columnas usando 'i` como columna clave de b.csv a un archivo a.csv.ACTUALIZACIÓN : para una longitud arbitraria de un diccionario anidado, vaya a esta respuesta .
Use la función defaultdict de las colecciones.
Alto rendimiento: "si la clave no está en dict" es muy costoso cuando el conjunto de datos es grande.
Bajo mantenimiento: haga que el código sea más legible y se pueda ampliar fácilmente.
fuente
from collections import defaultdict target_dict = defaultdict(dict) target_dict['1']['2']
me datarget_dict['1']['2'] KeyError: '2'
Para niveles arbitrarios de anidamiento:
fuente
Es importante recordar al usar defaultdict y módulos dict anidados similares como
nested_dict
, que buscar una clave inexistente puede crear inadvertidamente una nueva entrada de clave en el dict y causar muchos estragos.Aquí hay un ejemplo de Python3 con
nested_dict
módulo:Salida es:
fuente