2
votes

Pandas ne change pas les données catégorielles [sexe] en valeurs numériques [0/1]

J'essaie de travailler sur l'ensemble de données Titanic. Je souhaite convertir la colonne Sex en valeurs binaires. Voici ma tentative:

import pandas as pd
from numpy import corrcoef

train_dataset = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/train.csv")
test_dataset = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/test.csv")

survived = train_dataset['Survived']
pClass = train_dataset['Pclass']

#Doesn't work
sex = train_dataset['Sex'].replace([0,1],['female','male'],inplace=True)

age = train_dataset['Age']
fare = train_dataset['Fare']
parch = train_dataset['Parch']
sibSp = train_dataset['SibSp']

# print("Correlation between parent-children & survival is: " + str(corrcoef(survived, parch)))
# print("Correlation between age & survival is: " + str(corrcoef(survived, age)))
# print("Correlation between Siblings/Spouse & survival is: " + str(corrcoef(survived, sibSp)))

print(sex)

Et quand j'essaye de imprimer (sexe) , la console affiche Aucun !

J'ai également essayé de mettre en œuvre d'autres approches sur SO mais aucune d'elles ne semble fonctionner. Voici mon code source complet:

sex = train_dataset['Sex'].replace([0,1],['female','male'],inplace=True)


2 commentaires

Vous utilisez l'option inplace = True , cela change l'instance de train_dataset , au lieu de renvoyer une valeur. Maintenant que vous savez qu'aucune valeur n'est retournée lors de l'utilisation de inplace = True , vous comprendrez que sex doit être égal à None , car rien n'est revenu


Merci @KenHBS Je l'ai remarqué juste avant que Richard ne publie sa réponse. J'apprécie néanmoins votre aide. J'ai voté pour votre commentaire. Si vous pensez que c'était une question bien posée, pourriez-vous aussi me donner un vote favorable?


4 Réponses :


0
votes

Il y a deux problèmes ici, premièrement, vous avez inversé les arguments dans .replace (, ) . Deuxièmement, vous utilisez l'option inplace = True . Cela modifie l'instance train_dataset , au lieu de renvoyer une valeur.

Maintenant que vous savez qu'aucune valeur n'est renvoyée lors de l'utilisation de inplace = True , vous comprendrez que sex doit être égal à None , car rien n'est renvoyé:

>>> test = df.replace(['female', 'male'], [0, 1], inplace=True)
>>> type(test)
# <class 'NoneType'>

Sans replace = True :

Maintenant, lorsque nous remplaçons les valeurs, nous obtenons

>>> df.replace(['female', 'male'], [0, 1], inplace=True)
>>> df
#    a
# 0  0
# 1  1
# 2  1
# 3  0

Mais df lui-même a toujours exactement le même aspect que il l'a fait avant:

>>> df['a'] = df['a'].replace(['male', 'female'], [0,1])
>>> df
#    a
# 0  0
# 1  1
# 2  1
# 3  0

Donc, pour remplacer la valeur dans df , nous ferions:

>>> df
        a
#  0    male
#  1  female
#  2  female
#  3    male


0 commentaires

2
votes

Essayez :

sex = train_dataset['Sex'].replace(['female','male'],[0,1])
print(sex)

Il semble que votre syntaxe est désactivée. Voir le fonction de remplacement

Résultat: entrez la description de l'image ici


0 commentaires

1
votes

Vous pouvez utiliser np.where

dataset['sex']=np.where(dataset['sex']=='female',0,1)


4 commentaires

Pourquoi ne pas vérifier dataset ['sex'] == 'male' ?


le mâle reçoit un 1 par défaut. Vous pourriez aussi l'avoir de la manière np.where (dataset ['sex'] == 'male', 1,0) devrait également fonctionner et produire le même résultat.


Ah ok. Logique. Malheureusement, j'ai déjà accepté la réponse de Richard, mais je vous ai néanmoins voté pour vous remercier de vos efforts. Si vous pensez que c'était une question bien posée, pourriez-vous aussi me donner un vote favorable?


vous pouvez aussi essayer (même logique en fait;)) train_dataset ['Sex']. eq ('male'). astype (int) @ oo92



2
votes

Documentation officielle des paramètres:

inplace: bool, par défaut False Si True, en place. Remarque: ce sera modifier toutes les autres vues de cet objet (par exemple, une colonne d'un Trame de données). Renvoie l'appelant si c'est vrai.

Pour résumer, inplace = True renvoie None et inplace = False renvoie une copie de l'objet avec l'opération effectuée.

Ainsi, dans votre cas, comme l'opération est inplace = True , l'objet série d'origine train_dataset ['Sex'] est modifié. Essayez d'imprimer le train_dataset après l'opération, vous devriez voir le dataframe modifié.

Reportez-vous à la documentation officielle ici < / a>


0 commentaires