Attribuer séquentiellement des valeurs de deux listes différentes à une colonne dans une trame de données en python
J'ai deux valeurs différentes (animal ou outil) dans la colonne du dataframe. Ainsi, chaque cellule est soit un animal, soit un outil. J'ai une liste de noms d'animaux séparée et une liste de noms d'outils (qui ont les noms réels des outils et des animaux). Je veux que mon code parcourt chaque cellule de la colonne dans le dataframe et attribue un nom d'animal à partir de la liste d'animaux si la valeur de la cellule = animal; ou le nom de l'outil dans la liste d'outils si la valeur de la cellule est tool. Je veux que cela soit fait séquentiellement, donc si le dataframe ressemble à:
Index Category
0 animal
1 animal
2 tool
3 animal
4 tool
et la liste des animaux est:
cat
dog
parrot
bird
cheetah
et la liste d'outils est:
nail
iron
hammer
wheel
screw
la sortie doit être:
Index Category Output
0 animal cat
1 animal dog
2 tool nail
3 animal parrot
4 tool iron
Il semble que cela devrait être assez simple en Python mais n'a pas réussi. Toute aide serait appréciée. Merci!
Dans ce cas, puisqu'il n'y a que deux catégories, animal
et tool
, vous pouvez aborder ce problème de manière simple et efficace en sélectionnant les lignes qui contiennent la première et la dernière valeur de catégorie séparément et en leur attribuant les listes:
import numpy as np
import pandas as pd
# setup
df = pd.DataFrame({"Category": ['animal', 'animal', 'tool', 'animal', 'tool'], "Output": np.nan})
animal_list = ['cat', 'dog', 'parrot', 'bird', 'cheetah']
tool_list = ['nail', 'iron', 'hammer', 'wheel', 'screw']
# solution
df.loc[df.Category == 'animal', 'Output'] = np.resize(animal_list, df.loc[df.Category == 'animal', 'Output'].shape)
df.loc[df.Category == 'tool', 'Output'] = np.resize(tool_list, df.loc[df.Category == 'tool', 'Output'].shape)