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!
3 Réponses :
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]
merci l'homme cela fonctionne aussi.
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.
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.
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)
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
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_colorset 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.