【问题标题】:Filling in null values in one column based on aggregate of a different column根据不同列的聚合填充一列中的空值
【发布时间】:2020-03-01 12:40:24
【问题描述】:

我正在学习一些基本的数据科学,并且正在研究泰坦尼克号数据集。 “年龄”列有空值,我想用不同列的平均值填充,比如“Pclass”或“Sex”。

“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() 一起使用

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

【问题讨论】:

    标签: python pandas


    【解决方案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'))
    

    【讨论】:

    • 谢谢!我对矢量化的理解还不够远,但我会记住这一点!我也设法做到了``` df_train['Age'] = df_train.groupby('Pclass')['Age'].apply(lambda x: x.fillna(round(x.mean()))) ````这样做有什么问题吗?
    • @MushyMush groupby 解决方案没有错;我已经用更快、更简洁的代码版本编辑了我的答案。避免使用 apply,它很慢。
    • 注明。非常感谢!
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 2020-02-17
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多