Saya memiliki 2 file CSV: 'Data' dan 'Pemetaan':
- File 'Pemetaan' memiliki 4 kolom:
Device_Name
,GDN
,Device_Type
, danDevice_OS
. Keempat kolom diisi. - File 'Data' memiliki kolom-kolom yang sama, dengan
Device_Name
kolom diisi dan tiga kolom lainnya kosong. - Saya ingin kode Python saya untuk membuka kedua file dan untuk setiap
Device_Name
dalam file data, peta-nyaGDN
,Device_Type
danDevice_OS
nilai dari file Pemetaan.
Saya tahu cara menggunakan dict ketika hanya ada 2 kolom (1 harus dipetakan) tetapi saya tidak tahu bagaimana menyelesaikannya ketika 3 kolom perlu dipetakan.
Berikut ini adalah kode yang saya gunakan untuk menyelesaikan pemetaan 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)
Ia kembali Attribute Error
.
Setelah meneliti, saya pikir saya perlu membuat dict bersarang, tapi saya tidak tahu bagaimana melakukan ini.
Device_Name
kolom adalah kunci di kedua file, pada kunci ini saya ingin memetakan nilai Device_OS, GDN & Device_Type dari pemetaan file ke file data.row[27] = x[row[11]]["Device_OS"]
?Device_Name
indeks, lalu Anda bisa langsungjoin
dua dataframe pada indeks merekaDevice_Name
.Jawaban:
Dict bersarang adalah kamus di dalam kamus. Suatu hal yang sangat sederhana.
Anda juga dapat menggunakan
defaultdict
daricollections
paket untuk memfasilitasi pembuatan kamus bersarang.Anda dapat mengisi itu sesuai keinginan Anda.
Saya akan merekomendasikan sesuatu pada kode Anda seperti berikut:
Menurut komentar Anda :
Saran saya akan menjadi seperti ini (tanpa menggunakan defaultdict):
Harap dicatat, bahwa untuk parsing file csv ada modul csv .
sumber
a.csv
b.csv
,a.csv
memiliki 4 kolomi j k l
,b.csv
juga memiliki kolom ini.i
adalah jenis kolom kunci untuk csvs ini.j k l
kolom kosonga.csv
tetapi diisi padab.csv
. Saya ingin memetakan nilaij k l
kolom menggunakan 'i` sebagai kolom kunci dari file b.csv ke a.csv.PEMBARUAN : Untuk kamus acak bersarang, pilih jawaban ini .
Gunakan fungsi defaultdict dari koleksi.
Kinerja tinggi: "jika kunci tidak dalam dikt" sangat mahal ketika set data besar.
Pemeliharaan rendah: membuat kode lebih mudah dibaca dan dapat dengan mudah diperpanjang.
sumber
from collections import defaultdict target_dict = defaultdict(dict) target_dict['1']['2']
memberikutarget_dict['1']['2'] KeyError: '2'
Untuk tingkat sarang yang sewenang-wenang:
sumber
Penting untuk diingat ketika menggunakan defaultdict dan modul dict bersarang serupa seperti
nested_dict
, bahwa mencari kunci yang tidak ada dapat secara tidak sengaja membuat entri kunci baru di dict dan menyebabkan banyak kekacauan.Berikut ini adalah contoh Python3 dengan
nested_dict
modul:Output adalah:
sumber