J'ai deux pandas DataFrames, où le premier DataFrame a deux colonnes : "a" et "id" et le deuxième DataFrame a deux colonnes : "id" et "color_value". Je voudrais comparer les identifiants entre les deux DataFrames et s'il y a une correspondance, ajouter une colonne au premier DataFrame avec la bonne color_value. Essentiellement, j'utilise le deuxième DataFrame comme table de recherche pour trouver le bon ID et le faire correspondre à sa valeur de couleur correspondante.

Voir ci-dessous.

df_1 = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'id': ['001', '002', '001', '004', '003']})
df_2 = pd.DataFrame({'id': ['001', '002', '003', '004'], 'color_value': ['blue', 'red', 'yellow', 'orange']})

so df1:
a  id
1  001
2  002
3  001
4  004
5  003

df2:
id   color_value
001  blue
002  red
003  yellow
004  orange

I need a way to match up the IDs from df1 and df2 and add the color_value column to df1, so the result is:

df1:
a  id   color_value
1  001   blue
2  002   red
3  001   blue
4  004   orange
5  003   yellow
0
ASsoccer9 21 sept. 2021 à 23:18

2 réponses

Meilleure réponse

C'est exactement ce que fait une fusion de pandas ! Il existe différents types de fusions, mais celle que vous recherchez s'appelle une fusion "gauche". Cela signifie que dans la trame de données finale, toutes les lignes de votre première trame de données seront là, jointes avec uniquement les lignes de votre deuxième trame de données qui ont un identifiant correspondant.

Imaginez que votre première trame de données s'appelle la trame de données « gauche », et la seconde est la trame de données « droite ». Votre colonne id agit comme la "clé", contenant des valeurs qui pourraient correspondre entre les deux dataframes.

Voici comment vous pouvez utiliser la fonction de fusion pour atteindre votre objectif :

merged_df = df_1.merge(df_2, how='left', on='id')

Le paramètre "comment" est l'endroit où vous entrez le type de fusion que vous voulez faire (une fusion à gauche). Le paramètre "on" est l'endroit où vous mettez le nom de la colonne clé (la colonne id).

Résultat:

df_1:
   a   id
0  1  001
1  2  002
2  3  001
3  4  004
4  5  003

df_2:
  color_value   id
0        blue  001
1         red  002
2      yellow  003
3      orange  004

merged_df:
   a   id color_value
0  1  001        blue
1  2  002         red
2  3  001        blue
3  4  004      orange
4  5  003      yellow

Pour plus d'informations:

Documents pour la fonction de fusion (les exemples sont utiles) : Pandas. DataFrame.merge

Et un article avec plus d'informations sur les différents types de fusions : Pandas Merging 101

1
ekcarney 21 sept. 2021 à 21:01

Vous pouvez former un mappage en définissant df_2 avec id comme index à l'aide de .set_index() (agit comme les clés du mappage) et prenez la colonne color_value (agit comme les valeurs du mappage).

Ensuite, vous pouvez mapper id dans df_1 au mappage en utilisant .map(), comme suit :

df_1['color_value'] =  df_1['id'].map(df_2.set_index('id')['color_value'])

Ou en le décomposant en 2 lignes pour une meilleure lisibilité/compréhension, comme suit :

mapping = df_2.set_index('id')['color_value']
df_1['color_value'] =  df_1['id'].map(mapping)

Résultat:

print(df_1)

   a   id color_value
0  1  001        blue
1  2  002         red
2  3  001        blue
3  4  004      orange
4  5  003      yellow
1
SeaBean 21 sept. 2021 à 20:42