J'ai 2 fichiers CSV: 'Data' et 'Mapping':
- Fichier 'Mapping' a 4 colonnes:
Device_Name
,GDN
,Device_Type
etDevice_OS
. Les quatre colonnes sont remplies. - Le fichier 'Données' a ces mêmes colonnes, avec une
Device_Name
colonne remplie et les trois autres colonnes vides. - Je veux que mon code Python pour ouvrir les fichiers et pour chaque
Device_Name
dans le fichier de données, la carte sonGDN
,Device_Type
et laDevice_OS
valeur du fichier de mappage.
Je sais comment utiliser dict quand seulement 2 colonnes sont présentes (1 est nécessaire pour être mappé) mais je ne sais pas comment accomplir cela quand 3 colonnes doivent être mappées.
Voici le code à l'aide duquel j'ai essayé d'effectuer le mappage 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)
Il revient Attribute Error
.
Après quelques recherches, je pense que j'ai besoin de créer un dict imbriqué, mais je ne sais pas comment faire cela.
Device_Name
La colonne est la clé dans les deux fichiers, sur cette clé, je veux mapper les valeurs Device_OS, GDN et Device_Type du fichier de mappage au fichier de données.row[27] = x[row[11]]["Device_OS"]
?Device_Name
l'index, puis vous pouvez directementjoin
les deux dataframes sur leur indexDevice_Name
.Réponses:
Un dict imbriqué est un dictionnaire dans un dictionnaire. Une chose très simple.
Vous pouvez également utiliser un
defaultdict
ducollections
package pour faciliter la création de dictionnaires imbriqués.Vous pouvez le remplir comme vous le souhaitez.
Je recommanderais dans votre code quelque chose comme ce qui suit:
Selon votre commentaire :
Ma suggestion serait quelque chose comme ça (sans utiliser defaultdict):
Veuillez noter cependant que pour analyser les fichiers csv, il existe un module csv .
la source
a.csv
b.csv
,a.csv
4 colonnesi j k l
, j'aib.csv
également ces colonnes.i
est une sorte de colonnes clés pour ces csv '.j k l
La colonne est videa.csv
mais remplieb.csv
. Je veux mapper les valeurs desj k l
colonnes en utilisant 'i' comme colonne clé de b.csv vers un fichier.csv.MISE À JOUR : Pour une longueur arbitraire d'un dictionnaire imbriqué, accédez à cette réponse .
Utilisez la fonction defaultdict des collections.
Performances élevées: «si la clé n'est pas dans dict» est très coûteux lorsque le jeu de données est volumineux.
Faible maintenance: rend le code plus lisible et peut être facilement étendu.
la source
from collections import defaultdict target_dict = defaultdict(dict) target_dict['1']['2']
me donnetarget_dict['1']['2'] KeyError: '2'
Pour des niveaux arbitraires d'imbrication:
la source
Il est important de se rappeler lors de l'utilisation de defaultdict et de modules dict imbriqués similaires tels que
nested_dict
, que la recherche d'une clé inexistante peut créer par inadvertance une nouvelle entrée de clé dans le dict et causer beaucoup de ravages.Voici un exemple Python3 avec
nested_dict
module:La sortie est:
la source