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