pandas: fusionner (joindre) deux cadres de données sur plusieurs colonnes

169

J'essaie de joindre deux cadres de données pandas en utilisant deux colonnes:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

mais j'ai l'erreur suivante:

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4164)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4028)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13166)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13120)()

KeyError: '[B_1, c2]'

Avez-vous une idée de la bonne façon de procéder? Merci!

Edamame
la source
53
left_onet right_ondevrait être une liste de chaînes, pas une chaîne qui ressemble à une liste.
racine

Réponses:

313

Essaye ça

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

left_on: étiquette ou liste, ou noms de champs de type tableau à rejoindre dans le DataFrame de gauche. Peut être un vecteur ou une liste de vecteurs de la longueur du DataFrame pour utiliser un vecteur particulier comme clé de jointure au lieu de colonnes

right_on: étiquette ou liste, ou noms de champs de type tableau à rejoindre dans le DataFrame de droite ou le vecteur / liste de vecteurs par left_on docs

Shijo
la source
8
Si left_onet right_onsont les mêmes aet b, pouvons-nous utiliser on = ['a', 'b']?
ahbon
4
Oui, c'est parfaitement valable.
user3065757
4

le problème ici est qu'en utilisant les apostrophes, vous définissez la valeur transmise comme une chaîne, alors qu'en fait, comme @Shijo l'a indiqué dans la documentation, la fonction attend une étiquette ou une liste, mais pas une chaîne! Si la liste contient chacun des noms des êtres de colonnes passés pour la trame de données gauche et droite, alors chaque nom de colonne doit être individuellement entre apostrophes. Avec ce qui a été dit, nous pouvons comprendre pourquoi cela est incorrect:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

Et voici la manière correcte d'utiliser la fonction:

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])
Celius Stingher
la source
3

Une autre façon de procéder: new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')

john ed
la source