如何复用训练集groupby均值填充泰坦尼克测试集Age列NaN值?
复用训练集分组均值填充测试集Age缺失值的方法
没问题,这事儿其实很简单!你已经拿到了训练集的分组均值,只需要把这个均值集合保存下来,然后匹配测试集里对应的Sex和Pclass组合,就能精准填充缺失值了,而且还能避免机器学习里的数据泄露问题(毕竟不能用测试集自身的统计值来填充嘛)。
我给你两种靠谱的实现方式:
方法一:用apply+映射字典填充
首先把训练集计算好的分组均值存起来,然后遍历测试集的每一行,匹配对应的均值填充:
# 1. 从训练集提取并保存分组Age均值(这一步你已经会了) import pandas as pd df = pd.read_csv('train.csv') # 先完成训练集的填充(你的原有代码) df['Age'] = df.groupby(['Sex','Pclass'])['Age'].transform(lambda x:x.fillna(x.mean())) # 保存分组均值到变量 age_group_means = df.groupby(['Sex', 'Pclass'])['Age'].mean() # 2. 处理测试集 test_df = pd.read_csv('test.csv') # 填充测试集的Age缺失值:匹配对应(Sex, Pclass)的均值 test_df['Age'] = test_df['Age'].fillna( test_df.apply(lambda row: age_group_means[(row['Sex'], row['Pclass'])], axis=1) )
小提示:如果测试集里出现训练集没有的
(Sex, Pclass)组合(虽然泰坦尼克数据集里不太可能),这段代码会报错。可以加个兜底逻辑,比如用训练集整体的Age均值替代:
先计算训练集整体Age均值
overall_mean = df['Age'].mean()
填充时加默认值
test_df['Age'] = test_df['Age'].fillna(
test_df.apply(lambda row: age_group_means.get((row['Sex'], row['Pclass']), overall_mean), axis=1)
)
方法二:用merge合并均值再填充
这种方式逻辑更直观,也更安全,适合新手理解:
# 1. 同样先保存训练集的分组均值,转成DataFrame格式 age_means_df = df.groupby(['Sex', 'Pclass'])['Age'].mean().reset_index() # 给均值列改个名字,避免和测试集的Age列冲突 age_means_df = age_means_df.rename(columns={'Age': 'Age_Group_Mean'}) # 2. 合并测试集和均值DataFrame,按Sex和Pclass匹配 test_df = pd.read_csv('test.csv') test_df = test_df.merge(age_means_df, on=['Sex', 'Pclass'], how='left') # 3. 用匹配到的均值填充Age缺失值,然后删掉临时列 test_df['Age'] = test_df['Age'].fillna(test_df['Age_Group_Mean']) test_df = test_df.drop('Age_Group_Mean', axis=1)
这个方法哪怕遇到训练集没有的分组,Age_Group_Mean会是NaN,你可以再用整体均值或者其他方式兜底,容错性更强。
不管用哪种方法,核心都是复用训练集的统计量,这是机器学习数据预处理的关键原则,能保证模型训练和预测时的一致性~
内容的提问来源于stack exchange,提问作者onthemoon01
相关产品推荐
相关产品推荐

