Python 熊猫不会将分类数据[性别]更改为数值[0/1]

Python 熊猫不会将分类数据[性别]更改为数值[0/1],python,pandas,machine-learning,categorical-data,kaggle,Python,Pandas,Machine Learning,Categorical Data,Kaggle,我正在尝试通过泰坦尼克号数据集工作。我想将Sex列转换为二进制值。这是我的尝试: sex = train_dataset['Sex'].replace([0,1],['female','male'],inplace=True) 当我试图打印(性)时,控制台输出无 我也曾尝试在SO上实施其他方法,但它们似乎都不起作用。以下是我的完整源代码: import pandas as pd from numpy import corrcoef train_dataset = pd.read_csv("h

我正在尝试通过泰坦尼克号数据集工作。我想将
Sex
列转换为二进制值。这是我的尝试:

sex = train_dataset['Sex'].replace([0,1],['female','male'],inplace=True)
当我试图
打印(性)
时,控制台输出

我也曾尝试在SO上实施其他方法,但它们似乎都不起作用。以下是我的完整源代码:

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)

这里有两个问题,首先,您已经在
.replace(,)
中转换了参数。其次,您正在使用选项
inplace=True
。这将更改
train\u数据集
实例,而不是返回值

既然您知道在使用
inplace=True
时不会返回任何值,您就会明白
sex
应该等于
None
,因为不会返回任何值:

>>> import pandas as pd
>>> df = pd.DataFrame({'a': ['male', 'female', 'female', 'male']})
>>> df
        a
# 0    male
# 1  female
# 2  female
# 3    male
replace=True
: 现在,当我们替换这些值时,我们将得到

>>> df.replace(['female', 'male'], [0,1])
# a
# 0  1
# 1  0
# 2  0
# 3  1
但是
df
本身看起来仍然和以前完全一样:

>>> df
        a
#  0    male
#  1  female
#  2  female
#  3    male
因此,为了替换
df
中的值,我们将执行以下操作:

>>> df['a'] = df['a'].replace(['male', 'female'], [0,1])
>>> df
#    a
# 0  0
# 1  1
# 2  1
# 3  0
使用
replace=True
: 当您运行此命令时:
df.replace(['female','male'],[0,1],inplace=True))
,您将立即得到一个操作版本的
df

>>> df.replace(['female', 'male'], [0, 1], inplace=True)
>>> df
#    a
# 0  0
# 1  1
# 2  1
# 3  0
请注意,
inplace=True
参数使不返回任何值:

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

看起来你的语法不正确。见

输出:

您可以使用
np.where

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

参数的官方文件:

就地:bool,如果为True,则默认为False,就地。注:这将 修改此对象上的任何其他视图(例如,来自 数据帧)。如果这是真的,则返回调用者

总之,
inplace=True
返回
None
inplace=False
返回执行操作的对象的副本

因此,在您的情况下,由于操作是
inplace=True
,原始的序列对象
train\u数据集['Sex']
。尝试打印
train\u数据集
,操作完成后,您将看到修改后的数据帧


请参阅官方文档

您正在使用选项
inplace=True
,这将更改
train\u数据集
实例,而不是返回值。既然您知道使用
inplace=True
时不会返回任何值,您就会明白
sex
应该等于
None
,因为不会返回任何值hanks@KenHBS就在Richard发布答案之前,我注意到了这一点。尽管如此,我还是感谢你的帮助。我对你的评论投了赞成票。如果你认为这是一个问得很好的问题,你也能给我一个投票吗?为什么你不检查
数据集['sex']=='male'
?默认情况下,male被分配为1。你也可以这样做。其中(数据集['sex']='male',1,0)也应该工作并产生相同的输出。啊,好的。有道理。不幸的是,我已经接受了理查德的回答,但出于对你努力的感激,我还是投了你一票。如果你认为这是一个被问得很好的问题,你能给我一个投票吗?你也可以给这个一个机会(其实逻辑是一样的;)
train\u dataset['Sex'].eq('male').astype(int)
@oo92
dataset['sex']=np.where(dataset['sex']=='female',0,1)