web-dev-qa-db-fra.com

Remplacement des valeurs de colonne dans un pandas DataFrame

J'essaie de remplacer les valeurs dans une colonne d'un cadre de données. 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.

J'aimerais idéalement obtenir une sortie qui ressemble à la boucle suivante élément par élément.

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';

J'ai parcouru la documentation sur les pièges ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ), mais je ne peux pas comprendre pourquoi rien ne se passe.

Toute aide serait appréciée.

74
Black

Si je comprends bien, vous voulez quelque chose comme ça:

w['female'] = w['female'].map({'female': 1, 'male': 0})

(Ici, je convertis les valeurs en nombres au lieu de chaînes contenant des nombres. Vous pouvez les convertir en "1" et "0", si vous le souhaitez vraiment, mais je ne suis pas sûr de la raison pour laquelle vous le souhaitez.)

La raison pour laquelle votre code ne fonctionne pas, c'est parce que l'utilisation de ['female'] sur une colonne (le second 'female' dans votre w['female']['female']) ne signifie pas "sélectionner les lignes dont la valeur est" femme "". Cela signifie que vous devez sélectionner les lignes où index est "femelle", dont il ne peut y en avoir aucune dans votre DataFrame.

154
BrenBarn

Vous pouvez éditer un sous-ensemble d'un cadre de données en utilisant loc:

df.loc[<row selection>, <column selection>]

Dans ce cas:

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1
82
Jimmy Petersson
w.female.replace(to_replace=dict(female=1, male=0), inplace=True)

Voir pandas.DataFrame.replace () docs .

24
jfs

Légère variation:

w.female.replace(['male', 'female'], [1, 0], inplace=True)
22
deckard

Cela devrait également fonctionner:

w.female[w.female == 'female'] = 1 
w.female[w.female == 'male']   = 0
14
Nick Crawford

Vous pouvez également utiliser apply avec .get i.e.

w['female'] = w['female'].apply({'male':0, 'female':1}.get):

w = pd.DataFrame({'female':['female','male','female']})
print(w)

Dataframe w:

   female
0  female
1    male
2  female

Utilisation de apply pour remplacer les valeurs du dictionnaire:

w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)

Résultat:

   female
0       1
1       0
2       1 

Remarque: apply avec dictionnaire doit être utilisé si toutes les valeurs possibles des colonnes du cadre de données sont définies dans le dictionnaire. Sinon, il sera vide pour celles qui ne sont pas définies dans le dictionnaire. 

8
student

Vous pouvez également utiliser la fonction intégrée pd.get_dummies pour ces types d’assignations:

w['female'] = pd.get_dummies(w['female'],drop_first = True)

Cela vous donne un cadre de données avec deux colonnes, une pour chaque valeur apparaissant dans w ['femelle'], dont vous supprimez la première (car vous pouvez l'inférer à partir de celle qui reste). La nouvelle colonne est automatiquement nommée en tant que 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 nominales nécessaires pour distinguer tous les cas. Veillez à ne pas attribuer l'intégralité du bloc de données à une seule colonne, mais si w [«femme»] peut être «homme», «femme» ou «neutre», procédez comme suit:

w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
w.drop('female', axis = 1, inplace = True)

Ensuite, vous vous retrouvez avec deux nouvelles colonnes qui vous donnent le code factice de «femelle» et vous vous êtes débarrassé de la colonne avec les chaînes. 

7
galliwuzz

C'est très compact:

w['female'][w['female'] == 'female']=1
w['female'][w['female'] == 'male']=0

Un autre bon:

w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)
4
Azz

Il existe également une fonction dans pandas appelée factorize que vous pouvez utiliser pour effectuer automatiquement ce type de travail. Il convertit les étiquettes en nombres: ['male', 'female', 'male'] -> [0, 1, 0]. Voir this answer pour plus d’informations.

1
Roald

Je pense qu’en réponse devrait être indiqué quel type d’objet avez-vous dans toutes les méthodes suggérées ci-dessus: est-ce Series ou DataFrame.

Lorsque vous obtenez colonne par w.female. ou w[[2]] (où, supposons, 2 est le numéro de votre colonne), vous récupérez DataFrame . Vous pouvez donc utiliser des méthodes DataFrame telles que .replace.

Lorsque vous utilisez .loc ou iloc, vous récupérez Series, et Series n’ayant pas de méthode .replace, vous devez donc utiliser des méthodes telles que apply, map et ainsi de suite.

0
Alex-droid AD