[英]Filling missing values with groupby object on Pandas - Titanic dataset
我已经看到过类似的问题,但没有一个是我的答案,或者我没有看到/理解。 我是 ML 的新手,并试图用 Kaggle 上的已知数据集发现 numpy、pandas。 目前,我在 Titanic 数据集上。 我有 2 个不同的数据集:训练和测试。 我必须在训练和测试数据集的“年龄”列上填充缺失值。 我的标准是使用火车数据集创建的分组 object。 我用“Sex”、“Pclass”和“Title”(来自每个乘客姓名的标题)分组。
grouped = train.groupby(["Sex","Title","Pclass"])
grouped_m = grouped.median()
grouped_m = grouped_m.reset_index()[["Sex","Title","Pclass", "Age"]]
Output 是:
Sex Title Pclass Age
0 female Miss 1 30.0
1 female Miss 2 24.0
2 female Miss 3 18.0
3 female Mrs 1 40.0
4 female Mrs 2 32.0
5 female Mrs 3 31.0
6 female Officer 1 49.0
7 female Royalty 1 40.5
8 male Master 1 4.0
9 male Master 2 1.0
10 male Master 3 4.0
11 male Mr 1 40.0
12 male Mr 2 31.0
13 male Mr 3 26.0
14 male Officer 1 51.0
15 male Officer 2 46.5
16 male Royalty 1 40.0
这是我应用于“测试”数据集的“年龄”列的标准。 例如:当测试数据集上的一行,Sex = Female,Title = Miss,Pclass = 1,Age = NaN,Nan 值必须填写上面的 output,即 Age = 30。
填充前:
train["Age"].isna().sum()
Output 是:
177
我试过这个:
train["Age"] = train["Age"].fillna(grouped["Age"].transform("median"))
它完美地填充了火车集上的 NaN 值。
填写后:
train["Age"].isna().sum()
Output 是:
0
但是当我将它应用于测试数据集时,它根本没有改变,也没有给出任何错误。 填充前:
test["Age"].isna().sum()
Output 是:
86
然后我将 function 与我在火车数据集上创建的组 object 一起应用:
test["Age"] = test["Age"].fillna(grouped["Age"].transform("median"))
test["Age"].isna().sum()
Output 是:
86
测试数据集上仍然存在 NaN 值。 我应该如何应用这个 function 来使用我用训练数据集创建的分组 object 更改测试数据集上的 NaN 值?
我们想要填充缺失的年龄数据,而不是仅仅删除缺失的年龄数据行。 一种方法是填写所有乘客的平均年龄(估算)。 检查乘客 class 的平均年龄。 例如:
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#Data visualization to see the age difference due to Passenger class
plt.figure(figsize=(12, 7))
sns.boxplot(x='Pclass',y='Age',data=train,palette='winter')
def impute_age(cols):
Age = cols[0]
Pclass = cols[1]
if pd.isnull(Age):
if Pclass == 1:
return 37
elif Pclass == 2:
return 29
else:
return 24
else:
return Age
train['Age'] = train[['Age','Pclass']].apply(impute_age,axis=1)#filling the missing values
编辑:我使用 DataFrame.merge() 方法合并数据,正如@ALollz 建议的那样,显然是有效的。 这是代码:
# First filling NaN on train set as I did before.
grouped = train.groupby(["Sex","Title", "Pclass"])
grouped_m = grouped.median().reset_index()[["Sex", "Title", "Pclass", "Age"]]
train["Age"] = train["Age"].fillna(grouped["Age"].transform("median"))
# Then used pd.DataFrame.merge() to apply the same grouped features on the test data.
med = train.groupby(['Sex', 'Pclass', 'Title'],
as_index=False)['Age'].median()
test = test.merge(med, on=['Sex','Pclass','Title'], how='left', suffixes=('','_'))
test['Age'] = test['Age'].fillna(test.pop('Age_'))
谢谢大家!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.