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 None
和 inplace=False
returns 执行操作的对象的副本。
因此,在您的操作是 inplace=True
的情况下,修改了原始系列对象 train_dataset['Sex']
。尝试在操作后打印 train_dataset
,您应该会看到修改后的数据帧。
参考官方文档here
我正在尝试处理泰坦尼克号数据集。我想将 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 None
和 inplace=False
returns 执行操作的对象的副本。
因此,在您的操作是 inplace=True
的情况下,修改了原始系列对象 train_dataset['Sex']
。尝试在操作后打印 train_dataset
,您应该会看到修改后的数据帧。
参考官方文档here