3
votes

Comment faire correspondre des valeurs spécifiques dans deux DataFrames et ajouter des colonnes supplémentaires dans Python Pandas?

Comment pouvons-nous utiliser une boucle FOR pour faire correspondre la couleur de df_students à la couleur de df_colors, puis remplir le fruit correspondant et le fruit_id correspondant pour chaque élève de df_students?

import pandas as pd
df_colors = pd.DataFrame({'fruit_id':[101, 102, 103, 104, 105, 106, 107, 108, 109],
                       'fruit':['apple','banana','dragonfruit','kiwi','plum','lime', 'blackberry', 'blueberry', 'guava'],
                       'color':['red', 'yellow', 'magenta', 'brown', 'purple', 'green', 'black', 'blue', 'pink']})

df_students = pd.DataFrame({'student':['Jamie', 'Tao', 'Ingrid', 'Will', 'Boris','Xavier','Nancy', 'Judith', 'Lamar', 'Francis', 'Shawna', 'Carlos', 'Morgan'],
                        'color': ['black', 'red', 'magenta', 'yellow','black', 'magenta', 'brown', 'purple', 'magenta', 'green', 'blue', 'pink', 'pink']})


df_students['fruit'] = ''
df_students['fruit_id'] = ''
for eachstudent in df_students['color']:
    for acolor in df_colors['color']:
        if eachstudent == acolor:
            df_students['fruit'] = df_colors['fruit']
            df_students['fruit_id'] = df_colors['fruit_id']
df_students

Cette sortie est incorrect!

 MAUVAIS RÉSULTAT


3 commentaires

Vos données n'ont pas de sens? Comment le noir est-il associé à la pomme si la pomme a la couleur rouge en df_colors et la même chose pour le rouge et la banane?


@Erfan le code ci-dessus a une mauvaise sortie. Vous avez probablement raison, j'aurais pu l'indiquer. Merci pour la suggestion!


@Guy_Fuqua j'ai mis à jour avec les deux solutions, une pour la boucle for (pour la fusion) et l'autre qui est affichée sur la question.


3 Réponses :


1
votes

Que diriez-vous de ceci:

for num1,eachstudent in enumerate(df_students['color']):
    for num2,acolor in enumerate(df_colors['color']):
        if eachstudent == acolor:
            df_students['fruit'].values[num1] = df_colors['fruit'].values[num2]
            df_students['fruit_id'].values[num1] = df_colors['fruit_id'].values[num2]


1 commentaires

merci l'homme cela fonctionne aussi.



1
votes

Vous voulez simplement effectuer une fusion, vous n'avez pas besoin de 'for loop' pour cela.

Veuillez jeter un œil à Pandas Merging 101

La solution que vous recherchez:

df_students.merge(df_colors, on='color', how='left')


    student color   fruit_id    fruit
0   Jamie   black   107         blackberry
1   Tao     red     101         apple
2   Ingrid  magenta 103         dragonfruit
3   Will    yellow  102         banana
4   Boris   black   107         blackberry
5   Xavier  magenta 103         dragonfruit
6   Nancy   brown   104         kiwi
7   Judith  purple  105         plum
8   Lamar   magenta 103         dragonfruit
9   Francis green   106         lime
10  Shawna  blue    108         blueberry
11  Carlos  pink    109         guava
12  Morgan  pink    109         guava

Comme je l'ai dit, le résultat attendu que vous avez donné est incorrect si vous voulez faire correspondre la colonne color dans les deux dataframes.


1 commentaires

Vous avez absolument raison. J'avais la solution de fusion, j'étais intéressé par la solution de boucle for spécifiquement pour un projet.



2
votes
import pandas as pd

df_colors = pd.DataFrame({'fruit_id':[101, 102, 103, 104, 105, 106, 107, 108, 109],
                   'fruit':['apple','banana','dragonfruit','kiwi','plum','lime', 'blackberry', 'blueberry', 'guava'],
                   'color':['red', 'yellow', 'magenta', 'brown', 'purple', 'green', 'black', 'blue', 'pink']})

df_students = pd.DataFrame({'student':['Jamie', 'Tao', 'Ingrid', 'Will', 'Boris','Xavier','Nancy', 'Judith', 'Lamar', 'Francis', 'Shawna', 'Carlos', 'Morgan'],
                    'color': ['black', 'red', 'magenta', 'yellow','black', 'magenta', 'brown', 'purple', 'magenta', 'green', 'blue', 'pink', 'pink']})
df_students['fruit'] = ''
df_students['fruit_id'] = ''

for acolor1 in df_colors['color']: 
    df_students.loc[df_students['color']==acolor1,'fruit']= list(df_colors.loc[df_colors['color']==acolor1,'fruit'])[0]
    df_students.loc[df_students['color']==acolor1, 'fruit_id'] = list(df_colors.loc[df_colors['color']==acolor1, 'fruit_id'])[0]
print (df_students)

3 commentaires

parfait. Merci beaucoup!


Qu'indique le [0] à la fin? df_students.loc [df_students ['color'] == acolor1, 'fruit'] = list (df_colors.loc [df_colors ['color'] == acolor1, 'fruit']) [0]


Cela signifie que c'est un premier membre de la liste