Mam 2 pliki CSV: „Dane” i „Mapowanie”:
- Plik 'Mapping' ma 4 kolumny:
Device_Name
,GDN
,Device_Type
, iDevice_OS
. Wszystkie cztery kolumny są wypełnione. - Plik „Dane” zawiera te same kolumny, z
Device_Name
wypełnionymi kolumnami, a pozostałe trzy kolumny są puste. - Chcę, aby mój kod Pythona, aby otworzyć oba pliki i dla każdego
Device_Name
pliku danych, map jejGDN
,Device_Type
orazDevice_OS
wartości z pliku odwzorowania.
Wiem, jak używać dict, gdy obecne są tylko 2 kolumny (1 jest potrzebna do zmapowania), ale nie wiem, jak to zrobić, gdy trzeba zmapować 3 kolumny.
Poniżej znajduje się kod, za pomocą którego próbowałem wykonać mapowanie 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)
Wraca Attribute Error
.
Po kilku badaniach myślę, że muszę utworzyć zagnieżdżony dykt, ale nie mam pojęcia, jak to zrobić.
Device_Name
kolumna jest kluczem w obu plikach, w tym kluczu chcę zmapować wartości Device_OS, GDN i Device_Type z pliku mapowania do pliku danych.row[27] = x[row[11]]["Device_OS"]
?Device_Name
indeks, a następnie możesz bezpośredniojoin
umieścić dwie ramki danych w ich indeksieDevice_Name
.Odpowiedzi:
Zagnieżdżony słownik to słownik w słowniku. Bardzo prosta rzecz.
Możesz także użyć
defaultdict
zcollections
pakietu, aby ułatwić tworzenie zagnieżdżonych słowników.Możesz to wypełnić w dowolny sposób.
Poleciłbym w twoim kodzie coś takiego :
Zgodnie z Twoim komentarzem :
Moja sugestia byłoby coś jak to (bez użycia defaultdict):
Należy jednak pamiętać, że do analizowania plików csv istnieje moduł csv .
źródło
a.csv
b.csv
,a.csv
ma 4 kolumnyi j k l
,b.csv
też mam te kolumny.i
jest rodzajem kluczowych kolumn dla tych plików CSV.j k l
kolumna jest pusta,a.csv
ale wypełnionab.csv
. Chcę zmapować wartościj k l
kolumn przy użyciu „i” jako kolumny klucza z pliku b.csv do pliku a.csv.AKTUALIZACJA : Aby uzyskać dowolną długość zagnieżdżonego słownika, przejdź do tej odpowiedzi .
Użyj funkcji defaultdict z kolekcji.
Wysoka wydajność: „jeśli klucz nie jest podany” jest bardzo kosztowne, gdy zestaw danych jest duży.
Niskie koszty utrzymania: sprawiają, że kod jest bardziej czytelny i można go łatwo rozszerzyć.
źródło
from collections import defaultdict target_dict = defaultdict(dict) target_dict['1']['2']
daje mitarget_dict['1']['2'] KeyError: '2'
W przypadku dowolnych poziomów zagnieżdżenia:
źródło
Podczas korzystania z defaultdict i podobnych modułów zagnieżdżonych dykt należy pamiętać o
nested_dict
tym, że wyszukanie nieistniejącego klucza może nieumyślnie utworzyć nowy wpis klucza w dict i spowodować wiele spustoszenia.Oto przykład Python3 z
nested_dict
modułem:Wynik to:
źródło