You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复用训练集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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:03:27