Ich habe 2 CSV-Dateien: 'Daten' und 'Zuordnung':
- 'Mapping' Datei hat vier Spalten:
Device_Name
,GDN
,Device_Type
, undDevice_OS
. Alle vier Spalten werden ausgefüllt. - Die 'Daten'-Datei enthält dieselben Spalten, wobei die
Device_Name
Spalte ausgefüllt und die anderen drei Spalten leer sind. - Ich mag , dass mein Python - Code beiden Dateien öffnen und für jedes
Device_Name
in der Datendatei, Karte seinenGDN
,Device_Type
undDevice_OS
Wert aus der Mapping - Datei.
Ich weiß, wie man dict verwendet, wenn nur 2 Spalten vorhanden sind (1 muss zugeordnet werden), aber ich weiß nicht, wie dies erreicht werden soll, wenn 3 Spalten zugeordnet werden müssen.
Es folgt der Code, mit dem ich versucht habe, die Zuordnung von zu erreichen 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)
Es kehrt zurück Attribute Error
.
Nach einigen Recherchen denke ich, dass ich ein verschachteltes Diktat erstellen muss, aber ich habe keine Ahnung, wie das geht.
Device_Name
Die Spalte ist der Schlüssel in beiden Dateien. Auf diesem Schlüssel möchte ich Device_OS-, GDN- und Device_Type-Werte von der Zuordnungsdatei zur Datendatei zuordnen.row[27] = x[row[11]]["Device_OS"]
?Device_Name
den Index erstellen und dannjoin
die beiden Datenrahmen direkt in ihren Index aufnehmenDevice_Name
.Antworten:
Ein verschachteltes Diktat ist ein Wörterbuch innerhalb eines Wörterbuchs. Eine sehr einfache Sache.
Sie können auch ein
defaultdict
aus demcollections
Paket verwenden, um das Erstellen verschachtelter Wörterbücher zu erleichtern.Sie können das füllen, wie Sie möchten.
Ich würde in Ihrem Code etwas empfehlen wie die folgenden:
Nach Ihrem Kommentar :
Mein Vorschlag wäre etwas, wie dies (ohne defaultdict zu verwenden):
Bitte beachten Sie jedoch, dass zum Parsen von CSV-Dateien ein CSV-Modul vorhanden ist .
quelle
a.csv
b.csv
,a.csv
hat 4 Spalteni j k l
,b.csv
hat auch diese Spalten.i
ist eine Art Schlüsselspalten für diese CSVs.j k l
Die Spalte ist leer,a.csv
aber ausgefülltb.csv
. Ich möchte Werte vonj k l
Spalten mit 'i' als Schlüsselspalte von b.csv auf a.csv-Datei abbilden.UPDATE : Für eine beliebige Länge eines verschachtelten Wörterbuchs gehen Sie zu dieser Antwort .
Verwenden Sie die defaultdict-Funktion aus den Sammlungen.
Hohe Leistung: "Wenn der Schlüssel nicht diktiert wird" ist sehr teuer, wenn der Datensatz groß ist.
Geringer Wartungsaufwand: Machen Sie den Code besser lesbar und können Sie problemlos erweitern.
quelle
from collections import defaultdict target_dict = defaultdict(dict) target_dict['1']['2']
gibt mirtarget_dict['1']['2'] KeyError: '2'
Für beliebige Verschachtelungsebenen:
quelle
Bei der Verwendung von defaultdict und ähnlichen verschachtelten Diktatmodulen ist zu beachten
nested_dict
, dass das Nachschlagen eines nicht vorhandenen Schlüssels versehentlich einen neuen Schlüsseleintrag im Diktat erzeugen und viel Chaos verursachen kann.Hier ist ein Python3-Beispiel mit
nested_dict
Modul:Ausgabe ist:
quelle