根据另一列的汇总在一列中填充空值

时间:2020-02-29 23:09:55

标签: python pandas

我正在学习一些基础数据科学,并且正在研究泰坦尼克号数据集。 “年龄”列具有空值,我想用其他列的平均值(例如“ Pclass”或“性别”)填充。

“ Pclass”是指旅客舱位,根据旅客是持有一等,二等还是三等票而具有三个值(1、2、3)。

我正在尝试通过编写一个包含两个列名称(“年龄”和我们要用于汇总的列)的函数来概括此过程。我想不出如何完全概括这一点,所以现在,让我说我基于Pclass进行聚合。

我根据Pclass获得了平均年龄,如下所示:

# Figure out the mean age for each class
mean_age = round(df_train.groupby('Pclass').mean()['Age'])
mean_age

我试图定义以下函数(38,30和25)来自mean_age:

def fill_age(data, col1, col2):
    if data[col1].isnull():
        if data[col2] == 1:
            return 38
        elif data[col2] == 2:
            return 30
        else:
            return 25
    else:
        return data[col1]

并尝试使用.apply():

df_train['Age'] = df_train.apply(fill_age(df_train,'Age','Pclass'), axis = 1)

我在这里出了什么问题?我如何看待它来解决它并进一步推广呢?

编辑:以下行似乎已经起作用,但是我需要它来将更改应用于数据框本身,并且我不能对.apply()使用'inplace'

df_train.groupby('Pclass')['Age'].apply(lambda x: x.fillna(round(x.mean())))

1 个答案:

答案 0 :(得分:1)

您不应在apply内部调用函数,而应通过args=()或关键字参数传递函数和参数:

df['Age'] = df.apply(fill_age, col1='Age', col2='Pclass', axis=1)

但是有一种更好的方法可以通过矢量化来实现:

df['Age'] = df['Age'].fillna(df.groupby('Pclass')['Age'].transform('mean'))