Tenho 2 arquivos CSV: 'Data' e 'Mapping':
- Arquivo 'Mapping' tem 4 colunas:
Device_Name
,GDN
,Device_Type
, eDevice_OS
. Todas as quatro colunas são preenchidas. - O arquivo 'Data' possui essas mesmas colunas, com a
Device_Name
coluna preenchida e as outras três colunas em branco. - Eu quero meu código Python para abrir os arquivos e para cada
Device_Name
no arquivo de dados, mapear suaGDN
,Device_Type
eDevice_OS
valor do arquivo de mapeamento.
Eu sei como usar o dict quando apenas duas colunas estão presentes (é necessário que 1 seja mapeado), mas não sei como fazer isso quando três colunas precisam ser mapeadas.
A seguir está o código usando o qual tentei realizar o mapeamento 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)
Retorna Attribute Error
.
Depois de pesquisar, acho que preciso criar um ditado aninhado, mas não faço ideia de como fazer isso.
python
python-2.7
dictionary
mapping
nested
atams
fonte
fonte
Device_Name
coluna é a chave nos dois arquivos. Nesta chave, quero mapear os valores Device_OS, GDN e Device_Type do arquivo de mapeamento para o arquivo de dados.row[27] = x[row[11]]["Device_OS"]
?Device_Name
o índice e, em seguida, você pode diretamentejoin
os dois quadros de dados em seu índiceDevice_Name
.Respostas:
Um ditado aninhado é um dicionário dentro de um dicionário. Uma coisa muito simples.
Você também pode usar um
defaultdict
docollections
pacote para facilitar a criação de dicionários aninhados.Você pode preencher o que quiser.
Eu recomendaria no seu código algo como o seguinte:
De acordo com o seu comentário :
Minha sugestão seria algo assim (sem usar o defaultdict):
Observe, porém, que para analisar arquivos csv existe um módulo csv .
fonte
a.csv
b.csv
,a.csv
tem 4 colunasi j k l
,b.csv
também tem essas colunas.i
é o tipo de colunas-chave para esses csvs '.j k l
a coluna está vaziaa.csv
mas preenchidab.csv
. Quero mapear valores dej k l
colunas usando 'i' como coluna-chave de b.csv para um arquivo.csv.UPDATE : Para um comprimento arbitrário de um dicionário aninhado, vá para esta resposta .
Use a função defaultdict das coleções.
Alto desempenho: "se a chave não for ditada" é muito cara quando o conjunto de dados é grande.
Baixa manutenção: torne o código mais legível e pode ser facilmente estendido.
fonte
from collections import defaultdict target_dict = defaultdict(dict) target_dict['1']['2']
me dátarget_dict['1']['2'] KeyError: '2'
Para níveis arbitrários de aninhamento:
fonte
É importante lembrar ao usar defaultdict e módulos dict aninhados semelhantes, como
nested_dict
procurar uma chave inexistente pode inadvertidamente criar uma nova entrada de chave no dict e causar muitos estragos.Aqui está um exemplo Python3 com o
nested_dict
módulo:A saída é:
fonte