使用Pandas Titanic数据集上的groupby对象填充缺少的值

2024-04-18 22:36:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经看到过类似的问题,但没有一个是我的答案,或者我没有看到/理解。我是ML的新手,试图在Kaggle上发现拥有已知数据集的numpy熊猫。目前,我在泰坦尼克号数据集上。我有两个不同的数据集:训练和测试。我必须在列车和测试数据集的“年龄”列中填写缺失的值。我的条件是使用train dataset创建的分组对象。我用“性别”、“等级”和“头衔”(来自每个乘客姓名的头衔)进行分组

grouped = train.groupby(["Sex","Title","Pclass"])
grouped_m = grouped.median()
grouped_m = grouped_m.reset_index()[["Sex","Title","Pclass", "Age"]]

输出为:

    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

这是我在“测试”数据集的“年龄”列上应用的标准。例如:当测试数据集上的一行性别=女性、标题=未命中、Pclass=1、年龄=NaN时,NaN值必须用上述输出填充,输出值应为年龄=30

填写前:

train["Age"].isna().sum()

输出为:

177

我试过这个:

train["Age"] = train["Age"].fillna(grouped["Age"].transform("median"))

它完美地填补了火车上的价值观

填充后:

train["Age"].isna().sum()

输出为:

0

但当我将其应用于测试数据集时,它根本没有改变任何内容,也没有给出任何错误。 填写前:

test["Age"].isna().sum()

输出为:

86

然后,我对我在train dataset上创建的group object应用函数:

test["Age"] = test["Age"].fillna(grouped["Age"].transform("median"))
test["Age"].isna().sum()

输出为:

86

NaN值仍然存在于测试数据集上。我应该如何应用此函数来更改使用train dataset创建的分组对象的测试数据集上的NaN值


Tags: 数据testagetrainnandatasetmalefemale
2条回答

我们希望填充缺失的年龄数据,而不是仅仅删除缺失的年龄数据行。一种方法是填写所有乘客的平均年龄(插补)。 按乘客等级检查平均年龄。例如:

    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

编辑: 正如@ALollz所建议的那样,我使用DataFrame.merge()方法合并了数据,显然是可行的。代码如下:

# 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_'))

谢谢大家

相关问题 更多 >