Pandas 不将分类数据 [sex] 更改为数值 [0/1]

Pandas does not change categorical data [sex] to numerical values [0/1]

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

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

当我尝试 print(sex) 时,控制台输出 None!

我也尝试在 SO 上实施其他方法,但 none 似乎可行。以下是我的完整源代码:

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(<replace_this>, <with_this>)中的论点反过来了。其次,您正在使用选项 inplace=True。这会更改 train_dataset 实例,而不是返回值。

既然你知道了使用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'>

尝试:

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

看起来你的语法不对。参见 replace function

输出:

您可以使用np.where

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

参数官方文档:

inplace : bool, default False If True, in place. Note: this will modify any other views on this object (e.g. a column from a DataFrame). Returns the caller if this is True.

总而言之,inplace=True returns Noneinplace=False returns 执行操作的对象的副本。

因此,在您的操作是 inplace=True 的情况下,修改了原始系列对象 train_dataset['Sex']。尝试在操作后打印 train_dataset,您应该会看到修改后的数据帧。

参考官方文档here