J'essaye de remplacer les valeurs dans une colonne d'un dataframe. La colonne («femme») contient uniquement les valeurs «femme» et «homme».
J'ai essayé ce qui suit:
w['female']['female']='1'
w['female']['male']='0'
Mais recevez exactement la même copie des résultats précédents.
Je voudrais idéalement obtenir une sortie qui ressemble à la boucle suivante par élément.
if w['female'] =='female':
w['female'] = '1';
else:
w['female'] = '0';
J'ai parcouru la documentation de gotchas ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ) mais n'arrive pas à comprendre pourquoi rien ne se passe.
Toute aide serait appréciée.
.loc
syntaxe pour éviterSettingWithCopyWarning
: pandas.pydata.org/pandas-docs/stable/…Vous pouvez modifier un sous-ensemble d'un dataframe à l'aide de loc:
Dans ce cas:
la source
Voir la documentation pandas.DataFrame.replace () .
la source
Légère variation:
la source
Cela devrait également fonctionner:
la source
Vous pouvez également utiliser
apply
avec.get
iew['female'] = w['female'].apply({'male':0, 'female':1}.get)
:Dataframe
w
:Utilisation
apply
pour remplacer les valeurs du dictionnaire:Résultat:
Remarque:
apply
avec le dictionnaire doit être utilisé si toutes les valeurs possibles des colonnes dans le dataframe sont définies dans le dictionnaire sinon, il sera vide pour celles non définies dans le dictionnaire.la source
C'est très compact:
Un autre bon:
la source
Il existe également la fonction intégrée pd.get_dummies pour ces types d'affectations:
Cela vous donne un bloc de données avec deux colonnes, une pour chaque valeur qui apparaît dans w ['female'], dont vous supprimez la première (car vous pouvez la déduire de celle qui reste). La nouvelle colonne est automatiquement nommée comme la chaîne que vous avez remplacée.
Ceci est particulièrement utile si vous avez des variables catégorielles avec plus de deux valeurs possibles. Cette fonction crée autant de variables fictives nécessaires pour distinguer tous les cas. Faites attention alors à ne pas affecter la totalité du bloc de données à une seule colonne, mais à la place, si w ['female'] peut être 'male', 'female' ou 'neutral', faites quelque chose comme ceci:
Ensuite, vous vous retrouvez avec deux nouvelles colonnes vous donnant le codage factice de «femelle» et vous vous débarrassez de la colonne avec les chaînes.
la source
Utilisation
Series.map
avecSeries.fillna
Si votre colonne contient plus de chaînes que seulement
female
etmale
,Series.map
échouera dans ce cas car elle retourneraNaN
pour d'autres valeurs.C'est pourquoi nous devons l'enchaîner avec
fillna
:Exemple pourquoi
.map
échoue :Pour la bonne méthode, nous enchaînons
map
avecfillna
, donc nous remplissons leNaN
avec les valeurs de la colonne d'origine:la source
Il existe également une fonction dans
pandas
appeléefactorize
que vous pouvez utiliser pour effectuer automatiquement ce type de travail. Il convertit les étiquettes aux numéros:['male', 'female', 'male'] -> [0, 1, 0]
. Voir cette réponse pour plus d'informations.la source
Je pense qu'en réponse, il faut indiquer quel type d'objet obtenez-vous dans toutes les méthodes suggérées ci-dessus: s'agit-il d'une série ou d'un DataFrame.
Lorsque vous obtenez une colonne par
w.female.
ouw[[2]]
(où, supposons, 2 est le numéro de votre colonne), vous récupérez DataFrame. Donc, dans ce cas, vous pouvez utiliser des méthodes DataFrame comme.replace
.Lorsque vous utilisez
.loc
ou queiloc
vous récupérez Series, et Series n'ont pas de.replace
méthode, vous devez donc utiliser des méthodes commeapply
,map
et ainsi de suite.la source