Pandas:根据不同列的总和在一列中填充空值

问题描述 投票:0回答:1

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

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

我正在尝试通过编写一个函数来概括此过程,该函数采用两个列名'Age'和我们要用于聚合的列。我想不出如何完全概括这一点,所以现在,让我说我基于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())))
python pandas
1个回答
0
投票

您不应在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'))
© www.soinside.com 2019 - 2024. All rights reserved.