一个比较蠢的错误,在这里记下来
for dataset in data_cleaner: # data_cleaner[0]为训练集, data_cleaner[1]为测试集
# Age 年龄:用平均值替代NaN
dataset["Age"].fillna(dataset["Age"].median, inplace=True)
# Embarked 登陆港口:用众数替代NaN
dataset["Embarked"].fillna(dataset["Embarked"].mode, inplace=True)
# Fare 票价:用平均数替代NaN
dataset['Fare'].fillna(dataset["Fare"].mean, inplace=True)
median,mode,mean的后面都没有加上(),导致返回的类型为"method",在后续的astype处理中这些用来代替NaN的数据无法转为int或者float类型,报了标题所示的错误。
纠正方法:加上()就好了
for dataset in data_cleaner: # data_cleaner[0]为训练集, data_cleaner[1]为测试集
# Age 年龄:用平均值替代NaN
dataset["Age"].fillna(dataset["Age"].median(), inplace=True) # 设置inpalce = True才会改变源数据,还要注意median后要加(),不然返回的是method类型,无法操作
# Embarked 登陆港口:用众数替代NaN
dataset["Embarked"].fillna(dataset["Embarked"].mode(), inplace=True)
# Fare 票价:用平均数替代NaN
dataset['Fare'].fillna(dataset["Fare"].mean(), inplace=True)
这是后面的调用 astype()转换数据类型的代码
# 定义新特征 FamilySize IsAlone Title FareBin AgeBin
for dataset in data_cleaner:
# SibSp:乘客在船上的兄弟姐妹/配偶数量
# Parch:乘客在船上的父母/孩子数量
dataset["Family size"] = dataset['SibSp'] + dataset['Parch'] + 1
dataset["IsAlone"] = 1
dataset['IsAlone'].loc[dataset['Family size']>1] = 0 # .loc[]也可以传入布尔值列表
dataset['Title'] = dataset['Name'].str.split(", ", expand=True)[1].str.split(".", expand=True)[0] # 将拆分开的元素单独成列
dataset["FareBin"] = pd.qcut(dataset['Fare'], 4)
dataset["AgeBin"] = pd.cut(dataset["Age"].astype(int), 5)