我正在学习一些基础数据科学,并且正在研究泰坦尼克号数据集。 “年龄”列具有空值,我想用其他列的平均值(例如“ 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())))
答案 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'))