j'essaie de joindre deux trames de données, mais je n'arrive pas à me faire une idée des possibilités offertes par Python.
Première donnée:
ID MODEL REQUESTS ORDERS
1 Golf 123 4
2 Passat 34 5
3 Model 3 500 8
4 M3 5 0
Deuxième dataframe:
MODEL TYPE MAKE
Golf Sedan Volkswagen
M3 Coupe BMW
Model 3 Sedan Tesla
Ce que je veux, c'est ajouter une autre colonne dans le premier cadre de données appelée "make" afin qu'elle ressemble à ceci:
ID MODEL MAKE REQUESTS ORDERS
1 Golf Volkswagen 123 4
2 Passat Volkswagen 34 5
3 Model 3 Tesla 500 8
4 M3 BMW 5 0
J'ai déjà examiné fusionner, joindre et mapper, mais tous les exemples ajoutaient simplement les informations requises à la fin du cadre de données.
Je pense que vous pouvez utiliser insert
with map
by Series
créé avec df2
(si une valeur de la colonne MODEL
dans df2
est manquante, obtenez NaN
):
df1.insert(2, 'MAKE', df1['MODEL'].map(df2.set_index('MODEL')['MAKE']))
print (df1)
ID MODEL MAKE REQUESTS ORDERS
0 1 Golf Volkswagen 123 4
1 2 Passat NaN 34 5
2 3 Model 3 Tesla 500 8
3 4 M3 BMW 5 0
Bien que ce ne soit pas le cas dans ce cas, mais il peut exister des scénarios dans lesquels df2 comporte plus de deux colonnes et vous souhaitez simplement en ajouter un à df1 en fonction d'une colonne spécifique en tant que clé. Voici un code générique qui pourrait vous être utile.
df = pd.merge(df1, df2[['MODEL', 'MAKE']], on = 'MODEL', how = 'left')
La méthode join
agit de manière très similaire à VLOOKUP. Il joint une colonne du premier cadre de données à l'index du deuxième cadre de données. Vous devez donc définir MODEL
comme index du deuxième cadre de données et ne saisir que la colonne MAKE
.
df.join(df1.set_index('MODEL')['MAKE'], on='MODEL')
Jetez un coup d’œil à la documentation pour join , car elle utilise réellement Word VLOOKUP.
J'ai toujours trouvé que la fusion était un moyen facile de le faire:
df1.merge(df2[['MODEL', 'MAKE']], how = 'left')
Cependant, je dois admettre que ce ne serait pas aussi court et agréable si vous vouliez appeler la nouvelle colonne autrement que "MAKE".